diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index 83a0e36cd75ba6218cc401647490ee2e6490e318..0265770e748268431ca8aeb2d376ff9717808b88 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -11,7 +11,7 @@ Before submitting, please take the time to check the points below and provide so * [ ] [Link your Pull Request to an issue](https://help.github.com/en/github/managing-your-work-on-github/linking-a-pull-request-to-an-issue) (if applicable) * [ ] Create Work In Progress [WIP] pull requests only if you need clarification or an explicit review before you can continue your work item. * [ ] Make sure that your PR is not introducing _unnecessary_ reformatting (e.g., introduced by on-save hooks in your IDE) -* [ ] Make sure that your PR does not contain changes in strings.xml (see issue #72) +* [ ] Make sure that your PR does not contain changes in strings.xml (see issue #332) * [ ] Make sure that your PR does not contain compiled sources (already set by the default .gitignore) and / or binary files ## Description diff --git a/Corona-Warn-App/build.gradle b/Corona-Warn-App/build.gradle index 21a4222baf236cabf5822c1ab5e345368c4cb039..00541a9f46c9e7df7b17c2088a0f1482712c94da 100644 --- a/Corona-Warn-App/build.gradle +++ b/Corona-Warn-App/build.gradle @@ -32,8 +32,8 @@ android { applicationId 'de.rki.coronawarnapp' minSdkVersion 23 targetSdkVersion 29 - versionCode 25 - versionName "0.8.17" + versionCode 26 + versionName "0.8.18" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" buildConfigField "String", "DOWNLOAD_CDN_URL", "\"$DOWNLOAD_CDN_URL\"" diff --git a/Corona-Warn-App/src/device/java/de.rki.coronawarnapp/ui/main/MainFragment.kt b/Corona-Warn-App/src/device/java/de.rki.coronawarnapp/ui/main/MainFragment.kt index b3b01c57a95b745fddddada4b054386e17f69649..51c9fc97be080d39293ba1e9099df08ef45a59db 100644 --- a/Corona-Warn-App/src/device/java/de.rki.coronawarnapp/ui/main/MainFragment.kt +++ b/Corona-Warn-App/src/device/java/de.rki.coronawarnapp/ui/main/MainFragment.kt @@ -75,12 +75,7 @@ class MainFragment : Fragment() { TimerHelper.checkManualKeyRetrievalTimer() submissionViewModel.refreshDeviceUIState() tracingViewModel.refreshLastSuccessfullyCalculatedScore() - binding.mainScrollview.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_FOCUSED) - } - - override fun onStart() { - super.onStart() - binding.mainScrollview.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_FOCUSED) + binding.mainScrollview.sendAccessibilityEvent(AccessibilityEvent.TYPE_ANNOUNCEMENT) } private fun setContentDescription() { diff --git a/Corona-Warn-App/src/deviceForTesters/java/de.rki.coronawarnapp/TestRiskLevelCalculation.kt b/Corona-Warn-App/src/deviceForTesters/java/de.rki.coronawarnapp/TestRiskLevelCalculation.kt index a81b12c96b8c5bf9ca62c27ae76cf61f3785fc4c..76e9833d49ca35e56d83de2497aeaea468ae938a 100644 --- a/Corona-Warn-App/src/deviceForTesters/java/de.rki.coronawarnapp/TestRiskLevelCalculation.kt +++ b/Corona-Warn-App/src/deviceForTesters/java/de.rki.coronawarnapp/TestRiskLevelCalculation.kt @@ -130,9 +130,7 @@ class TestRiskLevelCalculation : Fragment() { } } - startObserving() - } override fun onResume() { @@ -344,7 +342,6 @@ class TestRiskLevelCalculation : Fragment() { } } - // todo remove before release - not used in prod setup - only for testing suspend fun asyncGetExposureInformation(token: String): List<ExposureInformation> = suspendCoroutine { cont -> exposureNotificationClient.getExposureInformation(token) diff --git a/Corona-Warn-App/src/deviceForTesters/java/de.rki.coronawarnapp/ui/main/MainFragment.kt b/Corona-Warn-App/src/deviceForTesters/java/de.rki.coronawarnapp/ui/main/MainFragment.kt index 502ba7fe7dd35bf60ce2f9b14bb578a3c1accc48..4c4dfe9d46a2baae1b17f866be80b15b6233dc8c 100644 --- a/Corona-Warn-App/src/deviceForTesters/java/de.rki.coronawarnapp/ui/main/MainFragment.kt +++ b/Corona-Warn-App/src/deviceForTesters/java/de.rki.coronawarnapp/ui/main/MainFragment.kt @@ -61,7 +61,6 @@ class MainFragment : Fragment() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) setButtonOnClickListener() - setContentDescription() } override fun onResume() { @@ -75,21 +74,12 @@ class MainFragment : Fragment() { TimerHelper.checkManualKeyRetrievalTimer() submissionViewModel.refreshDeviceUIState() tracingViewModel.refreshLastSuccessfullyCalculatedScore() - binding.mainScrollview.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_FOCUSED) + binding.mainScrollview.sendAccessibilityEvent(AccessibilityEvent.TYPE_ANNOUNCEMENT) } override fun onStart() { super.onStart() - binding.mainScrollview.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_FOCUSED) - } - - private fun setContentDescription() { - val shareButtonString: String = getString(R.string.button_share) - val menuButtonString: String = getString(R.string.button_menu) - val mainCardString: String = getString(R.string.hint_external_webpage) - binding.mainHeaderShare.buttonIcon.contentDescription = shareButtonString - binding.mainHeaderOptionsMenu.buttonIcon.contentDescription = menuButtonString - binding.mainAbout.mainCard.contentDescription = mainCardString + binding.mainScrollview.sendAccessibilityEvent(AccessibilityEvent.TYPE_ANNOUNCEMENT) } private fun setButtonOnClickListener() { diff --git a/Corona-Warn-App/src/deviceForTesters/res/layout/fragment_main.xml b/Corona-Warn-App/src/deviceForTesters/res/layout/fragment_main.xml index 6a9bd45d4e0208d49f49e6cac454f05170b1cc87..ff7992a8002da9e3e3c0e7e71ef283bc01916b68 100644 --- a/Corona-Warn-App/src/deviceForTesters/res/layout/fragment_main.xml +++ b/Corona-Warn-App/src/deviceForTesters/res/layout/fragment_main.xml @@ -209,10 +209,11 @@ android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_small" - app:layout_constraintBottom_toTopOf="@+id/guideline_bottom" app:layout_constraintEnd_toStartOf="@+id/guideline_card_end" app:layout_constraintStart_toStartOf="@+id/guideline_card_start" - app:layout_constraintTop_toBottomOf="@+id/main_barrier" /> + app:layout_constraintTop_toBottomOf="@+id/main_barrier" + app:layout_constraintBottom_toBottomOf="@+id/guideline_bottom" + app:layout_constraintVertical_bias="0.0"/> <include layout="@layout/merge_guidelines_side" /> diff --git a/Corona-Warn-App/src/deviceForTesters/res/layout/fragment_test_for_a_p_i.xml b/Corona-Warn-App/src/deviceForTesters/res/layout/fragment_test_for_a_p_i.xml index c0b516a9f780fe0d91ce2e9236dad02ef500a4cb..ba559e601e7cd88cd6ac9e71e1a5222f2b316f08 100644 --- a/Corona-Warn-App/src/deviceForTesters/res/layout/fragment_test_for_a_p_i.xml +++ b/Corona-Warn-App/src/deviceForTesters/res/layout/fragment_test_for_a_p_i.xml @@ -36,6 +36,7 @@ <TextView android:id="@+id/label_exposure_summary" style="@style/headline6" + android:accessibilityHeading="true" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/test_api_exposure_summary_headline" /> @@ -97,6 +98,7 @@ <TextView android:id="@+id/label_my_keys" style="@style/headline6" + android:accessibilityHeading="true" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_normal" @@ -118,6 +120,7 @@ <TextView android:id="@+id/label_other_keys" style="@style/headline6" + android:accessibilityHeading="true" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/test_api_body_other_keys" /> @@ -209,18 +212,21 @@ <TextView style="@style/headline4" + android:accessibilityHeading="true" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="headline4" /> <TextView style="@style/headline5" + android:accessibilityHeading="true" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="headline5" /> <TextView style="@style/headline6" + android:accessibilityHeading="true" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="headline6" /> diff --git a/Corona-Warn-App/src/deviceForTesters/res/layout/fragment_test_risk_level_calculation.xml b/Corona-Warn-App/src/deviceForTesters/res/layout/fragment_test_risk_level_calculation.xml index 60c2ee0182357d0a1cabee614db3229cd1207bef..a2fe370331b0ad99655b6481a915145af3763125 100644 --- a/Corona-Warn-App/src/deviceForTesters/res/layout/fragment_test_risk_level_calculation.xml +++ b/Corona-Warn-App/src/deviceForTesters/res/layout/fragment_test_risk_level_calculation.xml @@ -35,6 +35,7 @@ <TextView style="@style/headline6" + android:accessibilityHeading="true" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Preview (no interaction possible)" /> @@ -105,6 +106,7 @@ <TextView android:id="@+id/label_exposure_summary_title" style="@style/headline6" + android:accessibilityHeading="true" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_normal" @@ -119,6 +121,7 @@ <TextView android:id="@+id/label_risk_score_title" style="@style/headline6" + android:accessibilityHeading="true" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Risk Score" /> @@ -132,6 +135,7 @@ <TextView android:id="@+id/label_backend_parameters_title" style="@style/headline6" + android:accessibilityHeading="true" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Backend Parameters" /> @@ -145,6 +149,7 @@ <TextView android:id="@+id/label_formula_title" style="@style/headline6" + android:accessibilityHeading="true" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Used Formula" /> @@ -158,6 +163,7 @@ <TextView android:id="@+id/label_exposure_info_title" style="@style/headline6" + android:accessibilityHeading="true" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Exposure Information" /> @@ -171,6 +177,7 @@ <TextView android:id="@+id/label_full_config_title" style="@style/headline6" + android:accessibilityHeading="true" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Full Backend Configuration" /> diff --git a/Corona-Warn-App/src/deviceForTesters/res/menu/menu_main.xml b/Corona-Warn-App/src/deviceForTesters/res/menu/menu_main.xml index 95688307e6eae470f5ad3407f3b58edb64373769..680f4bd138172b7caab32caba8e1d768f73f43a1 100644 --- a/Corona-Warn-App/src/deviceForTesters/res/menu/menu_main.xml +++ b/Corona-Warn-App/src/deviceForTesters/res/menu/menu_main.xml @@ -8,7 +8,8 @@ <item android:id="@+id/menu_settings" android:title="@string/menu_settings" /> - <!-- Todo throwaway code only for testing --> + + <!-- These are for testing --> <item android:id="@+id/menu_test_api" android:title="@string/menu_test_api" /> diff --git a/Corona-Warn-App/src/main/assets/privacy_de.html b/Corona-Warn-App/src/main/assets/privacy_de.html index 910533ab367c183cd4312fa1aef29d1204a57eb7..2ac1d34bfecd848dc820d2e1ca4029649d2d7134 100644 --- a/Corona-Warn-App/src/main/assets/privacy_de.html +++ b/Corona-Warn-App/src/main/assets/privacy_de.html @@ -18,7 +18,7 @@ </h2> <p> Der Anbieter der Corona-Warn-App (im Folgenden die „<strong>App</strong>“) - ist das Robert Koch-Institut, Nordufer 20, 13353 Berlin (im Folgenden „ <strong>RKI</strong>“). + ist das Robert Koch-Institut, Nordufer 20, 13353 Berlin (im Folgenden „<strong>RKI</strong>“). </p> <p> Das RKI ist auch der datenschutzrechtlich Verantwortliche für die @@ -103,7 +103,7 @@ Zugriffsdaten fallen an, wenn Sie die folgenden Funktionen nutzen bzw. aktivieren: </p> -<ul type="disc"> +<ul> <li> Risiko-Ermittlung </li> @@ -122,7 +122,7 @@ <p> Zusätzlich werden folgende Daten verarbeitet: </p> -<ul type="disc"> +<ul> <li> Datum und Uhrzeit des Abrufs (Zeitstempel) </li> @@ -147,7 +147,7 @@ Wenn Sie auf Ihrem Smartphone die betriebssystemseitige Funktion zur Aufzeichnung von Kontakten zu anderen Nutzern aktivieren, versendet Ihr Smartphone per Bluetooth Low Energy kontinuierlich zufallsgenerierte - Kennnummern, auch als Zufallscodes zu bezeichnet (im Folgenden: „ <strong>Zufalls-IDs“</strong>), + Kennnummern, auch als Zufallscodes zu bezeichnet (im Folgenden: „<strong>Zufalls-IDs“</strong>), die von anderen Smartphones in Ihrer Nähe mit ebenfalls aktivierter Kontaktaufzeichnung empfangen werden können. Umgekehrt empfängt Ihr Smartphone auch die Zufalls-IDs der anderen @@ -155,7 +155,7 @@ von der Kontaktaufzeichnungs-Funktion Ihres Smartphones zusätzlich folgende Begegnungsdaten aufgezeichnet und gespeichert: </p> -<ul type="disc"> +<ul> <li> Datum und Zeitpunkt des Kontakts </li> @@ -684,9 +684,9 @@ </p> <p> Mit dem Betrieb und der Wartung eines Teils der technischen Infrastruktur - der App (z. B. Serversysteme, Hotline) hat das RKI die Deutsche Telekom AG - und die SAP Deutschland SE & Co. KG beauftragt, die insoweit als - Auftragsverarbeiter des RKI tätig werden (Artikel 28 DSGVO). + der App (z. B. Serversysteme, Hotline) hat das RKI die T-Systems + International GmbH und die SAP Deutschland SE & Co. KG beauftragt, die + insoweit als Auftragsverarbeiter des RKI tätig werden (Artikel 28 DSGVO). </p> <p> Im Ãœbrigen gibt das RKI personenbezogene Daten, die im Zusammenhang mit der @@ -782,5 +782,5 @@ können. </p> <p> - Stand: 09.06.2020 + Stand: 12.06.2020 </p> \ No newline at end of file diff --git a/Corona-Warn-App/src/main/assets/privacy_en.html b/Corona-Warn-App/src/main/assets/privacy_en.html index e56136dccee6627e424dad70a3b4ef9cdb09594f..8ccbad944eb6a23829765c425aae3773a5c48d52 100644 --- a/Corona-Warn-App/src/main/assets/privacy_en.html +++ b/Corona-Warn-App/src/main/assets/privacy_en.html @@ -11,7 +11,7 @@ </p> <p> To ensure that this privacy notice can be understood by all users, we have - made every effort to make it as simple and non-technical as possible. + made every effort to make it simple and as non-technical as possible. </p> <h2> 1. Who has provided you with this app? @@ -37,15 +37,16 @@ </p> <p> Although installing and using the App is voluntary, if you wish to use the - risk identification feature you still have to grant the RKI your consent to - let the App process your personal data (including health data, if the App - detects that you may be infected). You do this by tapping on the “Enable†- button the first time you open the App. This is necessary because otherwise - the App will not be able to access your smartphone’s exposure logging - feature. You can, however, use the toggle switch in the App to disable the - risk identification feature at any time. Doing this will mean that you are - unable to use the full functionality of the App. Separate consent is also - required for the data processing performed for the following features: + exposure logging feature you still have to grant the RKI your consent to + let the App process your personal data. You do this by tapping on the + “Enable Exposure Logging†button the first time you open the App. If the + App identifies a potential risk of infection for you, then your data also + includes health data. Your consent is necessary because otherwise the App + will not be able to access your smartphone’s exposure logging feature. You + can, however, use the toggle switch in the App to disable the exposure + logging feature at any time. Doing this will mean that you are unable to + use the full functionality of the App. Separate consent is also required + for the data processing performed for the following features: </p> <ul> <li> @@ -94,52 +95,44 @@ a. Access data </h3> <p> - Each time a file stored on a server is retrieved, this generates access - data. Specifically, the following data is processed with each retrieval: + Access data is generated when you use or enable the following features: </p> <ul> <li> - IP address - </li> - <li> - Date and time of retrieval (time stamp) - </li> - <li> - Transmitted data volume (or packet length) + Exposure Logging </li> <li> - Notification of successful retrieval - </li> - <li> - Requesting domain - </li> - <li> - Operating system used + Registering a test </li> <li> - Device type (smartphone), the manufacturer and the model of your - smartphone (e.g. iPhone 7 or Galaxy S9). + Sharing your test result. </li> </ul> <p> - This access data is only processed to secure and maintain the technical - infrastructure. You are not identified personally as a user of the App and - it is not possible to create a user profile. + Each time data is retrieved from the App’s server system, your IP address + (on the upstream load balancer) is masked and no longer used within the + App’s server system. </p> <p> - Access data is generated when you use or enable the following features: + The following data is also processed: </p> -<ul type="disc"> +<ul> <li> - Risk identification + Date and time of retrieval (time stamp) </li> <li> - Registering a test + Transmitted data volume (or packet length) </li> <li> - Sharing your test result. + Notification of successful retrieval. </li> </ul> +<p> + This access data is only processed to secure and maintain the technical + infrastructure. You are not identified personally as a user of the App and + it is not possible to create a user profile. The IP address will not be + saved beyond the end of the period of use. +</p> <h3> b. Contact data </h3> @@ -147,28 +140,33 @@ If you enable exposure logging in your smartphone’s operating system, which serves to record encounters (contacts) with other users, then your smartphone will continuously send out randomly generated identification - numbers (“<strong>random IDs</strong>â€) via Bluetooth, which other - smartphones in your vicinity can receive if exposure logging is also + numbers (“<strong>random IDs</strong>â€) via Bluetooth Low Energy, which + other smartphones in your vicinity can receive if exposure logging is also enabled on them. Your smartphone, in turn, also receives the random IDs of the other smartphones. In addition to the random IDs received from other smartphones, your smartphone’s exposure logging functionality records and stores the following contact data: </p> -<ul type="disc"> +<ul> <li> - Date of the contact + Date and time of the contact </li> <li> Duration of the contact </li> <li> - Bluetooth signal strength of the contact. + Bluetooth signal strength of the contact + </li> + <li> + Encrypted metadata (protocol version and transmission strength). </li> </ul> <p> Your own random IDs and those received from other smartphones as well as - the other contact data (date, duration, signal strength) are recorded by - your smartphone in an exposure log and stored there for 14 days. + the other contact data (date and time of the contact, duration of the + contact, signal strength of the contact and encrypted metadata) are + recorded by your smartphone in an exposure log and currently stored there + for 14 days. </p> <p> The functionality used to record encounters with other users is called @@ -193,7 +191,7 @@ </p> <p> The App will only process the contact data generated and stored by your - smartphone if the App’s risk identification feature is enabled. + smartphone if the App’s exposure logging feature is enabled. </p> <h3> c. Health data @@ -205,11 +203,11 @@ risk that the person has been infected with the coronavirus). </p> <p> - Your health data will be processed in the following cases: + The following cases involve processing health data: </p> <ul> <li> - If the risk identification feature detects that you may have been in + If the exposure logging feature detects that you may have been in contact with a person who has been infected with the coronavirus. </li> <li> @@ -223,25 +221,25 @@ 6. App features </h2> <h3> - a. Risk identification + a. Exposure Logging </h3> <p> - The App’s core functionality is risk identification. This serves to track + The App’s core functionality is exposure logging. This serves to track possible contacts with other users of the App who are infected with the coronavirus, to evaluate the risk that you yourself have been infected, and – based on the risk identified – to provide you with health advice and recommendations for what to do next. </p> <p> - If you enable the risk identification feature, then several times a day - while the App runs in the background (or when you tap on “Updateâ€), the App - will retrieve a list from the App’s server system of random IDs from users - who have shared a positive test result. The App shares these random IDs - with your smartphone’s exposure logging functionality, which then compares - them with the random IDs stored in your smartphone’s exposure log. If your - smartphone’s exposure logging functionality detects a match, it transfers - the contact data (date, duration, signal strength) to the App, but not the - random ID of the contact in question. + If you enable the exposure logging feature, then several times a day while + the App runs in the background (or when you tap on “Updateâ€), the App will + retrieve a list from the App’s server system of random IDs from users who + have tested positive and shared their own random IDs. The App shares these + random IDs with your smartphone’s exposure logging functionality, which + then compares them with the random IDs stored in your smartphone’s exposure + log. If your smartphone’s exposure logging functionality detects a match, + it transfers the contact data (date, duration, signal strength) to the App, + but not the random ID of the contact in question. </p> <p> In the event of a contact, the App analyses the contact data provided by @@ -252,7 +250,7 @@ To account for new findings as and when they arise, the RKI can update the evaluation algorithm by adjusting its settings. The settings for the evaluation algorithm are sent to the App together with the list of random - IDs. + IDs of infected users. </p> <p> The identification of your risk of infection is only carried out locally on @@ -265,7 +263,7 @@ The legal basis for the processing of your access data, contact data and, if applicable, health data (if the App determines that you may have been infected) described above is your consent which you gave when enabling the - risk identification feature. + exposure logging feature. </p> <h3> b. Registering a test @@ -299,15 +297,15 @@ <p> The code number read from the QR code is then hashed by the App, which means that the App performs a certain mathematical procedure in order to - convert the code number in such a way that nobody can identify it. As soon - as your smartphone is connected to the internet, the App will transmit the - hashed code number to the App’s server system. In return, the App receives - a token from the server system, i.e. a digital access key that is stored in - the App. The token is linked to the hashed code number on the server - system. The App then deletes the hashed code number on your smartphone. The - server system will only issue a token once for each hashed code number. - This ensures that your QR code cannot be used by other users of the App to - retrieve test results. + convert the code number in such a way that it can no longer be recognised. + As soon as your smartphone is connected to the internet, the App will + transmit the hashed code number to the App’s server system. In return, the + App receives a token from the server system, i.e. a digital access key that + is stored in the App. The token is linked to the hashed code number on the + server system. The App then deletes the hashed code number on your + smartphone. The server system will only issue a token once for each hashed + code number. This ensures that your QR code cannot be used by other users + of the App to retrieve test results. </p> <p> This completes the registration of your test. @@ -355,13 +353,13 @@ c. Sharing your test result </h3> <p> - If you share your positive test result in order to warn other users, the - App will transfer the random IDs generated and stored by your smartphone - from the last 14 days and the TAN to the App’s server system. The server - system first checks whether the TAN is valid and then adds your random IDs - to the list of random IDs of users who have shared a positive test result. - Your random IDs can now be downloaded by other users as part of the risk - identification process. + If you use the feature for sharing your test result in order to warn other + users, the App will transfer the random IDs generated and stored by your + smartphone from the last 14 days and the TAN to the App’s server system. + The server system first checks whether the TAN is valid and then adds your + random IDs to the list of random IDs of users who have shared a positive + test result. Your random IDs can now be downloaded by other users as part + of the exposure logging process. </p> <p> <u>If you have not retrieved your test result in the App:</u> @@ -376,7 +374,7 @@ 7540002. The operator will first ask you some questions over the phone to check the plausibility of your call. These questions serve to prevent fraudulent reports of infections and any resulting incorrect warnings and - risk levels. Once you have answered these questions sufficiently, you will + risk status. Once you have answered these questions sufficiently, you will be asked for your mobile/telephone number. This is so that you can be called back later and given a TeleTAN to enter in the App. Your mobile/telephone number will only be temporarily stored for this purpose @@ -403,7 +401,10 @@ As long as you use the App for information purposes only, i.e. do not use any of the App features mentioned above and do not enter any data, then processing only takes place locally on your smartphone and no personal data - is generated. + is generated. Websites linked in the app, such as www.bundesregierung.de, will + open in your smartphone’s standard browser. The data processed here depends + on the browser used, your browser settings, and the data processing + practices of the website you are visiting. </p> <h2> 7. What permissions and functionality does the App require? @@ -426,9 +427,9 @@ </li> </ul> <p> - The App requires an internet connection for the risk identification - feature, and so that it can receive and transmit test results, so that it - can communicate with the App’s server system. + The App requires an internet connection for the exposure logging feature, + and so that it can receive and transmit test results, so that it can + communicate with the App’s server system. </p> <ul> <li> @@ -474,10 +475,10 @@ </li> </ul> <p> - The App’s risk identification feature requires this functionality. - Otherwise, no exposure log with the random IDs of your contacts will be - available. The functionality must be enabled within the App to allow the - App to access the exposure log. + The App’s exposure logging feature requires this functionality. Otherwise, + no exposure log with the random IDs of your contacts will be available. The + functionality must be enabled within the App to allow the App to access the + exposure log. </p> <ul> <li> @@ -523,10 +524,10 @@ </li> </ul> <p> - The App’s risk identification feature requires this functionality, - otherwise no exposure log with the random IDs of your contacts will be - available. The functionality must be enabled within the App to allow the - App to access the exposure log. + The App’s exposure logging feature requires this functionality, otherwise + no exposure log with the random IDs of your contacts will be available. The + functionality must be enabled within the App to allow the App to access the + exposure log. </p> <ul> <li> @@ -557,13 +558,13 @@ the App features: </p> <h3> - a. Risk identification + a. Exposure Logging </h3> <ul> <li> The list of random IDs of users who have shared a positive test result - will be deleted from the App immediately after comparison with the - random IDs in your smartphone’s exposure log. + will be deleted from the App immediately, and also automatically + deleted from your smartphone’s exposure log after 14 days. </li> <li> The RKI has no way of influencing the deletion of contact data in your @@ -576,9 +577,9 @@ settings. </li> <li> - The risk level displayed in the App will be deleted as soon as a new - risk level has been determined. A new risk level is usually determined - after the App has received a new list of random IDs. + The risk status displayed in the App will be deleted as soon as a new + risk status has been determined. A new risk status is usually + determined after the App has received a new list of random IDs. </li> </ul> <h3> @@ -601,7 +602,8 @@ </li> <li> The token stored in the app will be deleted from the smartphone after - the App is deleted or after the test result is shared. + the App is deleted or after using the feature for sharing the test + result. </li> </ul> <h3> @@ -647,11 +649,11 @@ last 14 days will be passed on to the App on other users’ smartphones. </p> <p> - The RKI has commissioned Deutsche Telekom AG and SAP Deutschland SE & - Co. KG to operate and maintain part of the technical infrastructure of the - App (e.g. server system, hotline), meaning that these two companies are - processors under data protection law and acting on the RKI’s behalf - (Article 28 GDPR). + The RKI has commissioned T-Systems International GmbH and SAP Deutschland + SE & Co. KG to operate and maintain part of the technical + infrastructure of the App (e.g. server system, hotline), meaning that these + two companies are processors under data protection law and acting on the + RKI’s behalf (Article 28 GDPR). </p> <p> Otherwise, the RKI will only pass on personal data collected in connection @@ -676,10 +678,10 @@ affect the lawfulness of the processing before the withdrawal. </p> <p> - To withdraw your consent to the risk identification feature, you can - disable the feature using the toggle switch in the App or delete the App. - If you decide to use the risk identification feature again, you can toggle - the feature back on or reinstall the App. + To withdraw your consent to the exposure logging feature, you can disable + the feature using the toggle switch in the App or delete the App. If you + decide to use the exposure logging feature again, you can toggle the + feature back on or reinstall the App. </p> <p> To withdraw your consent to the test registration feature, you can delete @@ -711,8 +713,9 @@ the rights under Articles 15, 16, 17, 18, 20 and 21 GDPR, </li> <li> - the right to contact the official RKI data protection officer and raise your concerns - (Article 38(4) GDPR) and + the right to contact the official RKI data protection officer + (https://www.rki.de/DE/Content/Institut/OrgEinheiten/Datenschutz/Datenschutz_node.html) + and raise your concerns (Article 38(4) GDPR) and </li> <li> the right to lodge a complaint with a competent data protection @@ -738,5 +741,5 @@ you which is not available to the RKI. </p> <p> - Last amended: 5 June 2020 + Last amended: 12 June 2020 </p> \ No newline at end of file diff --git a/Corona-Warn-App/src/main/assets/terms_de.html b/Corona-Warn-App/src/main/assets/terms_de.html index 1557ef6716491539d5d373d2ec4c5ad7e54cf2e3..fe94001fbca8a76ec1bdef282504bfaeb5d38b15 100644 --- a/Corona-Warn-App/src/main/assets/terms_de.html +++ b/Corona-Warn-App/src/main/assets/terms_de.html @@ -573,7 +573,6 @@ </p> <p> 10. WICHTIGE HINWEISE ZU VERFÃœGBARKEIT UND ÄNDERUNGEN - </p> <p> Kein Anspruch auf bestimmte Funktionalität diff --git a/Corona-Warn-App/src/main/assets/terms_en.html b/Corona-Warn-App/src/main/assets/terms_en.html index 9b3867b6e5241117c65070641a21f522bde2ea35..beeecf6708e1fa295b837731a43b3af6dd1a896a 100644 --- a/Corona-Warn-App/src/main/assets/terms_en.html +++ b/Corona-Warn-App/src/main/assets/terms_en.html @@ -210,7 +210,6 @@ </p> <p> 3. WHAT DO I DO IF I HAVE BEEN EXPOSED TO A CONFIRMED CASE? - </p> <p> If the App notifies you that you have been exposed to a confirmed case, you @@ -246,7 +245,6 @@ </p> <p> 4. THE APP DOES NOT PROTECT YOU AGAINST INFECTION - </p> <p> The App serves to disrupt chains of infection. @@ -452,9 +450,8 @@ <p> The App uses functions implemented specifically by Apple on iOS and Google on Android ("exposure notification"). These are only available on iOS - version 13.5 and upwards and Android version 6 - and upwards. Unfortunately the App does not work with earlier versions of - those operating systems. + version 13.5 and upwards and Android version 6 and upwards. Unfortunately + the App does not work with earlier versions of those operating systems. </p> <p> 8. LIMITATIONS OF THE APP @@ -468,10 +465,9 @@ One of these is that, while the App is constantly sending out random IDs (rolling proximity identifiers), it only receives random IDs from other devices at specific intervals. The windows for receiving data in the App - are currently up to five minutes apart and are only very short, namely - [two to four]seconds. - All these functionalities are based on the underlying Exposure Notification - Framework from Apple and Google and can be changed by these companies at any time. + are currently up to five minutes apart and are only very short.. All these + functionalities are based on the underlying Exposure Notification Framework + from Apple and Google and can be changed by these companies at any time. </p> <p> The Bluetooth signal attenuation is used for the proximity measurement. A 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 cdbae945643e8df4c020dda6c6670256b99307de..4925705a4bb88a784f162ff47f1b165072208820 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 @@ -27,6 +27,7 @@ open class CwaSuccessResponseWithCodeMismatchNotSupportedError(val statusCode: I open class CwaInformationalNotSupportedError(val statusCode: Int) : CwaWebException(statusCode) open class CwaRedirectNotSupportedError(val statusCode: Int) : CwaWebException(statusCode) +class CwaUnknownHostException : CwaWebException(901) class BadRequestException : CwaClientError(400) class UnauthorizedException : CwaClientError(401) class ForbiddenException : CwaClientError(403) diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/exception/reporting/ErrorCodes.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/exception/reporting/ErrorCodes.kt index 5b89a01d3dd66e1dcc6cea51c4df0631dc69b712..de691a2a9770c24956e208496bddae1a00e15364 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/exception/reporting/ErrorCodes.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/exception/reporting/ErrorCodes.kt @@ -21,5 +21,6 @@ enum class ErrorCodes(val code: Int) { // NONTECHNICAL NO_NETWORK_CONNECTIVITY(1), NOT_ENOUGH_AVAILABLE_SPACE_ON_DISK(2), + API_EXCEPTION(3), EXTERNAL_NAVIGATION(10), } diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/exception/reporting/ErrorReportReceiver.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/exception/reporting/ErrorReportReceiver.kt index d9e4be92bf3f856789644a2a70a95962dd8bc34d..ff37fe4dd14aa7619832cef0f90c268f0d5465aa 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/exception/reporting/ErrorReportReceiver.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/exception/reporting/ErrorReportReceiver.kt @@ -36,6 +36,14 @@ class ErrorReportReceiver(private val activity: Activity) : BroadcastReceiver() message = context.resources.getString(resId) } + if (intent.hasExtra(ReportingConstants.ERROR_REPORT_API_EXCEPTION_CODE)) { + val apiStatusCode = intent.getIntExtra( + ReportingConstants.ERROR_REPORT_API_EXCEPTION_CODE, + ErrorCodes.REPORTED_EXCEPTION_UNKNOWN_PROBLEM.code + ) + message += "($apiStatusCode)" + } + val stack = intent.getStringExtra(ReportingConstants.ERROR_REPORT_STACK_EXTRA) val title = context.resources.getString(R.string.errors_generic_headline) val confirm = context.resources.getString(R.string.errors_generic_button_positive) diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/exception/reporting/ExceptionReporter.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/exception/reporting/ExceptionReporter.kt index 2031a593644cf760dfce34a2f4b0bd9ea1373c4b..3ad303932cb3a6902a1fdb803295bd63c1e9b895 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/exception/reporting/ExceptionReporter.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/exception/reporting/ExceptionReporter.kt @@ -2,7 +2,9 @@ package de.rki.coronawarnapp.exception.reporting import android.content.Intent import androidx.localbroadcastmanager.content.LocalBroadcastManager +import com.google.android.gms.common.api.ApiException import de.rki.coronawarnapp.CoronaWarnApplication +import de.rki.coronawarnapp.R import de.rki.coronawarnapp.exception.ExceptionCategory import java.io.PrintWriter import java.io.StringWriter @@ -26,6 +28,16 @@ fun Throwable.report( this.resId?.let { intent.putExtra(ReportingConstants.ERROR_REPORT_RES_ID, it) } } + // override the message with a generic one if it is an ApiException + if (this is ApiException) { + intent.putExtra( + ReportingConstants.ERROR_REPORT_RES_ID, + R.string.errors_communication_with_api + ) + intent.putExtra(ReportingConstants.ERROR_REPORT_CODE_EXTRA, ErrorCodes.API_EXCEPTION.code) + intent.putExtra(ReportingConstants.ERROR_REPORT_API_EXCEPTION_CODE, this.statusCode) + } + val sw = StringWriter() this.printStackTrace() this.printStackTrace(PrintWriter(sw)) diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/exception/reporting/ReportingConstants.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/exception/reporting/ReportingConstants.kt index bf3bba6159798e3ea8d2f54c9c760ef07545f94a..be711c01353325bf57fb693ac16ecd82523456b6 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/exception/reporting/ReportingConstants.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/exception/reporting/ReportingConstants.kt @@ -8,6 +8,7 @@ object ReportingConstants { const val ERROR_REPORT_MESSAGE_EXTRA = "message" const val ERROR_REPORT_STACK_EXTRA = "stack" const val ERROR_REPORT_CODE_EXTRA = "code" + const val ERROR_REPORT_API_EXCEPTION_CODE = "api-exception-code" const val ERROR_REPORT_RES_ID = "res-id" val ERROR_REPORT_UNKNOWN_ERROR = ErrorCodes.REPORTED_EXCEPTION_UNKNOWN_PROBLEM.code } diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/http/HttpErrorParser.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/http/HttpErrorParser.kt index 4cda5df1eb32c3c6a672bf7fbd7960dab92ff8ee..dec2043075ebf8241f0f91301c1905b0bc1ab6b2 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/http/HttpErrorParser.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/http/HttpErrorParser.kt @@ -8,6 +8,7 @@ import de.rki.coronawarnapp.exception.http.CwaInformationalNotSupportedError import de.rki.coronawarnapp.exception.http.CwaRedirectNotSupportedError import de.rki.coronawarnapp.exception.http.CwaServerError import de.rki.coronawarnapp.exception.http.CwaSuccessResponseWithCodeMismatchNotSupportedError +import de.rki.coronawarnapp.exception.http.CwaUnknownHostException import de.rki.coronawarnapp.exception.http.CwaWebException import de.rki.coronawarnapp.exception.http.ForbiddenException import de.rki.coronawarnapp.exception.http.GatewayTimeoutException @@ -25,40 +26,47 @@ import de.rki.coronawarnapp.exception.http.UnauthorizedException import de.rki.coronawarnapp.exception.http.UnsupportedMediaTypeException import okhttp3.Interceptor import okhttp3.Response +import java.net.UnknownHostException class HttpErrorParser : Interceptor { override fun intercept(chain: Interceptor.Chain): Response { - val response = chain.proceed(chain.request()) - return when (val code = response.code) { - 200 -> response - 201 -> response - 202 -> response - 204 -> response - 400 -> throw BadRequestException() - 401 -> throw UnauthorizedException() - 403 -> throw ForbiddenException() - 404 -> throw NotFoundException() - 409 -> throw ConflictException() - 410 -> throw GoneException() - 415 -> throw UnsupportedMediaTypeException() - 429 -> throw TooManyRequestsException() - 500 -> throw InternalServerErrorException() - 501 -> throw NotImplementedException() - 502 -> throw BadGatewayException() - 503 -> throw ServiceUnavailableException() - 504 -> throw GatewayTimeoutException() - 505 -> throw HTTPVersionNotSupported() - 511 -> throw NetworkAuthenticationRequiredException() - 598 -> throw NetworkReadTimeoutException() - 599 -> throw NetworkConnectTimeoutException() - else -> { - if (code in 100..199) throw CwaInformationalNotSupportedError(code) - if (code in 200..299) throw CwaSuccessResponseWithCodeMismatchNotSupportedError(code) - if (code in 300..399) throw CwaRedirectNotSupportedError(code) - if (code in 400..499) throw CwaClientError(code) - if (code in 500..599) throw CwaServerError(code) - throw CwaWebException(code) + try { + val response = chain.proceed(chain.request()) + return when (val code = response.code) { + 200 -> response + 201 -> response + 202 -> response + 204 -> response + 400 -> throw BadRequestException() + 401 -> throw UnauthorizedException() + 403 -> throw ForbiddenException() + 404 -> throw NotFoundException() + 409 -> throw ConflictException() + 410 -> throw GoneException() + 415 -> throw UnsupportedMediaTypeException() + 429 -> throw TooManyRequestsException() + 500 -> throw InternalServerErrorException() + 501 -> throw NotImplementedException() + 502 -> throw BadGatewayException() + 503 -> throw ServiceUnavailableException() + 504 -> throw GatewayTimeoutException() + 505 -> throw HTTPVersionNotSupported() + 511 -> throw NetworkAuthenticationRequiredException() + 598 -> throw NetworkReadTimeoutException() + 599 -> throw NetworkConnectTimeoutException() + else -> { + if (code in 100..199) throw CwaInformationalNotSupportedError(code) + if (code in 200..299) throw CwaSuccessResponseWithCodeMismatchNotSupportedError( + code + ) + if (code in 300..399) throw CwaRedirectNotSupportedError(code) + if (code in 400..499) throw CwaClientError(code) + if (code in 500..599) throw CwaServerError(code) + throw CwaWebException(code) + } } + } catch (err: UnknownHostException) { + throw CwaUnknownHostException() } } } diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/risk/RiskLevelCalculation.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/risk/RiskLevelCalculation.kt index b2e73150567df72cf5441316ad9229f5e190b406..10547f52aa6de3e406c3fe72459c15421e9cb301 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/risk/RiskLevelCalculation.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/risk/RiskLevelCalculation.kt @@ -17,14 +17,14 @@ object RiskLevelCalculation { /** all attenuation values are capped to [TimeVariables.MAX_ATTENUATION_DURATION] */ val weightedAttenuationLow = - attenuationParameters.weights.low.capped() - .times(exposureSummary.attenuationDurationsInMinutes[0]) + attenuationParameters.weights.low + .times(exposureSummary.attenuationDurationsInMinutes[0].capped()) val weightedAttenuationMid = - attenuationParameters.weights.mid.capped() - .times(exposureSummary.attenuationDurationsInMinutes[1]) + attenuationParameters.weights.mid + .times(exposureSummary.attenuationDurationsInMinutes[1].capped()) val weightedAttenuationHigh = - attenuationParameters.weights.high.capped() - .times(exposureSummary.attenuationDurationsInMinutes[2]) + attenuationParameters.weights.high + .times(exposureSummary.attenuationDurationsInMinutes[2].capped()) val maximumRiskScore = exposureSummary.maximumRiskScore.toDouble() @@ -49,7 +49,7 @@ object RiskLevelCalculation { return round(riskScore.times(DECIMAL_MULTIPLIER)).div(DECIMAL_MULTIPLIER) } - private fun Double.capped(): Double { + private fun Int.capped(): Int { return if (this > TimeVariables.getMaxAttenuationDuration()) { TimeVariables.getMaxAttenuationDuration() } else { diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/risk/TimeVariables.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/risk/TimeVariables.kt index a7d6a7f29ac4b11b74bcd24ec6b71ba5c50c6663..1dc1d93d7afd2358b79ad5ebccc2618e9a6b3250 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/risk/TimeVariables.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/risk/TimeVariables.kt @@ -1,6 +1,7 @@ package de.rki.coronawarnapp.risk import com.google.android.gms.common.api.ApiException +import de.rki.coronawarnapp.BuildConfig import de.rki.coronawarnapp.CoronaWarnApplication import de.rki.coronawarnapp.exception.ExceptionCategory import de.rki.coronawarnapp.exception.reporting.report @@ -89,26 +90,22 @@ object TimeVariables { */ fun getMaxStaleExposureRiskRange(): Int = MAX_STALE_EXPOSURE_RISK_RANGE - /** - * This is the exact number of days until the end of time is reached. - * This is used by the Google Exposure Notification API daysSinceLastExposure property in the - * ExposureSummary if there was no contact with someone. - */ - private const val END_OF_TIME_DAYS = 2147483647 - - /** - * Getter function for [END_OF_TIME_DAYS] - * - * @return number of days until end of time - */ - fun getEndOfTimeDays() = END_OF_TIME_DAYS + private const val MILISECONDS_IN_A_SECOND = 1000 + private const val SECONDS_IN_A_MINUTES = 60 + private const val MINUTES_IN_AN_HOUR = 60 + private const val HOURS_IN_AN_DAY = 24 /** * Delay in milliseconds for manual key retrieval process - * Internal requirements: 24 hours = 1000 * 60 * 60 * 24 milliseconds - * TODO Change this to the real 24 Hours + * Value for testing: 1 min = 1000 * 60 * 1 + * Value: 24 hours = 1000 * 60 * 60 * 24 milliseconds */ - private const val MANUAL_KEY_RETRIEVAL_DELAY = 1000 * 60 * 1 + private val MANUAL_KEY_RETRIEVAL_DELAY = + if (BuildConfig.FLAVOR == "deviceForTesters") { + MILISECONDS_IN_A_SECOND * SECONDS_IN_A_MINUTES + } else { + MILISECONDS_IN_A_SECOND * SECONDS_IN_A_MINUTES * MINUTES_IN_AN_HOUR * HOURS_IN_AN_DAY + } /** * Getter function for [MANUAL_KEY_RETRIEVAL_DELAY] @@ -121,7 +118,7 @@ object TimeVariables { * This is the maximum attenuation duration value for the risk level calculation * in minutes */ - private const val MAX_ATTENUATION_DURATION = 30.0 + private const val MAX_ATTENUATION_DURATION = 30 /** * Getter function for [MAX_ATTENUATION_DURATION] @@ -160,18 +157,6 @@ object TimeVariables { * CALCULATED TIME VARIABLES ****************************************************/ - /** - * The timeRange for calculating the exposure risk figures - * In milliseconds - * - * @return Pair of Long describing the timerange in milliseconds - */ - fun getCalculationTimeRange(): Pair<Long, Long> = - Pair( - getTimeRangeFromRetentionPeriod(), - System.currentTimeMillis() - ) - /** * The time since the last successful exposure calculation ran in foreground or background. * In milliseconds diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/service/applicationconfiguration/ApplicationConfigurationService.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/service/applicationconfiguration/ApplicationConfigurationService.kt index 07c6b91af73856451948ef350194aa89208cc9f6..c8f8d61882679af31a63cceca26e7a23334916b9 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/service/applicationconfiguration/ApplicationConfigurationService.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/service/applicationconfiguration/ApplicationConfigurationService.kt @@ -13,7 +13,6 @@ object ApplicationConfigurationService { asyncRetrieveApplicationConfiguration() .mapRiskScoreToExposureConfiguration() - // todo double check that the weighted params are not used private fun ApplicationConfiguration.mapRiskScoreToExposureConfiguration(): ExposureConfiguration = ExposureConfiguration .ExposureConfigurationBuilder() diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/storage/LocalData.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/storage/LocalData.kt index 6be3628848ace7942f65bfd7a9de2d23b32e9b6a..802451cdb4bdd8b994e07a8774a101838a871478 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/storage/LocalData.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/storage/LocalData.kt @@ -89,9 +89,7 @@ object LocalData { 0L ) - // TODO need this for nullable ref, shout not be goto for nullable storage if (timestamp == 0L) return null - return timestamp } @@ -121,9 +119,7 @@ object LocalData { .getString(R.string.preference_last_non_active_tracing_timestamp), 0L ) - // TODO need this for nullable ref, shout not be goto for nullable storage if (timestamp == 0L) return null - return timestamp } @@ -134,7 +130,6 @@ object LocalData { * @param value timestamp in ms */ fun lastNonActiveTracingTimestamp(value: Long?) = getSharedPreferenceInstance().edit(true) { - // TODO need this for nullable ref, shout not be goto for nullable storage putLong( CoronaWarnApplication.getAppContext().getString( R.string.preference_last_non_active_tracing_timestamp @@ -150,7 +145,6 @@ object LocalData { * @param value timestamp in ms */ fun totalNonActiveTracing(value: Long?) { - // TODO need this for nullable ref, shout not be goto for nullable storage getSharedPreferenceInstance().edit(true) { putLong( CoronaWarnApplication.getAppContext() @@ -323,7 +317,6 @@ object LocalData { .getString(R.string.preference_timestamp_diagnosis_keys_fetch), 0L ) - // TODO need this for nullable ref, shout not be goto for nullable storage if (time == 0L) return null return Date(time) @@ -535,9 +528,7 @@ object LocalData { 0L ) - // TODO need this for nullable ref, shout not be goto for nullable storage if (timestamp == 0L) return null - return timestamp } 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 c018540071a67b3cdae95a30ccf3f7aae6de0881..8617cabc2426738890686886971cb1f07e7127e2 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 @@ -67,7 +67,6 @@ object TracingRepository { * * @see InternalExposureNotificationClient */ - // TODO [EN] Define EN error handling suspend fun refreshIsTracingEnabled() { try { val isEnabled = InternalExposureNotificationClient.asyncIsEnabled() diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/transaction/RiskLevelTransaction.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/transaction/RiskLevelTransaction.kt index e0043fa81daf170fb6bdb36581178cf0897b86fe..01adeab172dc8f5cbe498d7683c9a3f5642e2336 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/transaction/RiskLevelTransaction.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/transaction/RiskLevelTransaction.kt @@ -4,10 +4,7 @@ import androidx.core.app.NotificationCompat import com.google.android.gms.nearby.exposurenotification.ExposureSummary import de.rki.coronawarnapp.CoronaWarnApplication import de.rki.coronawarnapp.R -import de.rki.coronawarnapp.exception.ExceptionCategory -import de.rki.coronawarnapp.exception.NoNetworkException import de.rki.coronawarnapp.exception.RiskLevelCalculationException -import de.rki.coronawarnapp.exception.reporting.report import de.rki.coronawarnapp.nearby.InternalExposureNotificationClient import de.rki.coronawarnapp.notification.NotificationHelper import de.rki.coronawarnapp.risk.RiskLevel @@ -314,7 +311,7 @@ object RiskLevelTransaction : Transaction() { /** * Executes the [CHECK_APP_CONNECTIVITY] Transaction State * If there is no connectivity the transaction will set the last calculated - * risk level, report a [NoNetworkException] and closes the transaction + * risk level and closes the transaction * * @return */ @@ -325,11 +322,6 @@ object RiskLevelTransaction : Transaction() { if (!isNetworkEnabled) { RiskLevelRepository.setLastCalculatedRiskLevelAsCurrent() - NoNetworkException( - IllegalStateException("Network is required to retrieve the Application Configuration") - ).report( - ExceptionCategory.CONNECTIVITY - ) return@executeState false } return@executeState true diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/information/InformationAboutFragment.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/information/InformationAboutFragment.kt index d88206e60abfc543f45aa6719b13a42362c1aeee..7f0860263e9f8bb9794edb408748f84bb23a8fd8 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/information/InformationAboutFragment.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/information/InformationAboutFragment.kt @@ -39,14 +39,9 @@ class InformationAboutFragment : Fragment() { setButtonOnClickListener() } - override fun onStart() { - super.onStart() - binding.informationAboutScrollview.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_FOCUSED) - } - override fun onResume() { super.onResume() - binding.informationAboutScrollview.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_FOCUSED) + binding.informationAboutContainer.sendAccessibilityEvent(AccessibilityEvent.TYPE_ANNOUNCEMENT) } private fun setButtonOnClickListener() { diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/information/InformationContactFragment.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/information/InformationContactFragment.kt index fd26db493731bf2d07c72fad757c4b572a6f2f87..6b351030c0f2712e25a9b14be40911e267cebcd8 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/information/InformationContactFragment.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/information/InformationContactFragment.kt @@ -41,14 +41,9 @@ class InformationContactFragment : Fragment() { setButtonOnClickListener() } - override fun onStart() { - super.onStart() - binding.informationContactContainer.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_FOCUSED) - } - override fun onResume() { super.onResume() - binding.informationContactContainer.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_FOCUSED) + binding.informationContactContainer.sendAccessibilityEvent(AccessibilityEvent.TYPE_ANNOUNCEMENT) } private fun setButtonOnClickListener() { diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/information/InformationFragment.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/information/InformationFragment.kt index bc14cbf4b571f6c69e9da5b3992378a7de1acbdc..9a6bd0b92f067cf0371595d1674c799776c4c921 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/information/InformationFragment.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/information/InformationFragment.kt @@ -5,6 +5,7 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.view.accessibility.AccessibilityEvent +import android.view.accessibility.AccessibilityNodeInfo import androidx.fragment.app.Fragment import androidx.navigation.fragment.findNavController import de.rki.coronawarnapp.R @@ -41,16 +42,24 @@ class InformationFragment : Fragment() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) setButtonOnClickListener() - } - - override fun onStart() { - super.onStart() - binding.informationContainer.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_FOCUSED) + setAccessibilityDelegate() } override fun onResume() { super.onResume() - binding.informationContainer.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_FOCUSED) + binding.informationContainer.sendAccessibilityEvent(AccessibilityEvent.TYPE_ANNOUNCEMENT) + } + + private fun setAccessibilityDelegate() { + val accessibilityDelegate: View.AccessibilityDelegate = + object : View.AccessibilityDelegate() { + override fun onInitializeAccessibilityNodeInfo(v: View?, info: AccessibilityNodeInfo) { + super.onInitializeAccessibilityNodeInfo(v, info) + val string: String = getString(R.string.information_help_title_accessibility) + info.text = string + } + } + binding.informationHelp.mainRowItemSubtitle.accessibilityDelegate = accessibilityDelegate } private fun setButtonOnClickListener() { diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/information/InformationLegalFragment.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/information/InformationLegalFragment.kt index cbe86b19918311d0193945e0f49eb0dc2517a015..053d1bb2fa06b08794858cab2cb2393b616cc23c 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/information/InformationLegalFragment.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/information/InformationLegalFragment.kt @@ -39,14 +39,9 @@ class InformationLegalFragment : Fragment() { setButtonOnClickListener() } - override fun onStart() { - super.onStart() - binding.informationLegalContainer.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_FOCUSED) - } - override fun onResume() { super.onResume() - binding.informationLegalContainer.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_FOCUSED) + binding.informationLegalContainer.sendAccessibilityEvent(AccessibilityEvent.TYPE_ANNOUNCEMENT) } private fun setButtonOnClickListener() { diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/information/InformationPrivacyFragment.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/information/InformationPrivacyFragment.kt index d7ee64f534321deec1a6cd635ef9df18dfaa9f79..c445f900f1539bfd1ef4e31ae4b9c10138a99311 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/information/InformationPrivacyFragment.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/information/InformationPrivacyFragment.kt @@ -39,14 +39,9 @@ class InformationPrivacyFragment : Fragment() { setButtonOnClickListener() } - override fun onStart() { - super.onStart() - binding.informationPrivacyContainer.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_FOCUSED) - } - override fun onResume() { super.onResume() - binding.informationPrivacyContainer.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_FOCUSED) + binding.informationPrivacyContainer.sendAccessibilityEvent(AccessibilityEvent.TYPE_ANNOUNCEMENT) } private fun setButtonOnClickListener() { diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/information/InformationTechnicalFragment.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/information/InformationTechnicalFragment.kt index eeef00278c61f0e76d22a3564ef99590cc522245..a4ee7576532e3928a945d24b1704b46eefab41e9 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/information/InformationTechnicalFragment.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/information/InformationTechnicalFragment.kt @@ -39,14 +39,9 @@ class InformationTechnicalFragment : Fragment() { setButtonOnClickListener() } - override fun onStart() { - super.onStart() - binding.informationTechnicalContainer.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_FOCUSED) - } - override fun onResume() { super.onResume() - binding.informationTechnicalContainer.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_FOCUSED) + binding.informationTechnicalContainer.sendAccessibilityEvent(AccessibilityEvent.TYPE_ANNOUNCEMENT) } private fun setButtonOnClickListener() { diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/information/InformationTermsFragment.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/information/InformationTermsFragment.kt index ad0a09245ad517ea322102f4142a76a01ef83c6c..98a4079e6a084554861912d4f0ad375ba5fc4531 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/information/InformationTermsFragment.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/information/InformationTermsFragment.kt @@ -39,14 +39,9 @@ class InformationTermsFragment : Fragment() { setButtonOnClickListener() } - override fun onStart() { - super.onStart() - binding.informationTermsContainer.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_FOCUSED) - } - override fun onResume() { super.onResume() - binding.informationTermsContainer.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_FOCUSED) + binding.informationTermsContainer.sendAccessibilityEvent(AccessibilityEvent.TYPE_ANNOUNCEMENT) } private fun setButtonOnClickListener() { diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/main/MainOverviewFragment.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/main/MainOverviewFragment.kt index 4de437340053c067c4361c960d27e81274aa7ea8..67b6ebbe80b2cfc72150ad78ee1b68f853d17c61 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/main/MainOverviewFragment.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/main/MainOverviewFragment.kt @@ -43,14 +43,9 @@ class MainOverviewFragment : Fragment() { setButtonOnClickListener() } - override fun onStart() { - super.onStart() - binding.mainOverviewContainer.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_FOCUSED) - } - override fun onResume() { super.onResume() - binding.mainOverviewContainer.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_FOCUSED) + binding.mainOverviewContainer.sendAccessibilityEvent(AccessibilityEvent.TYPE_ANNOUNCEMENT) } private fun setButtonOnClickListener() { diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/main/MainShareFragment.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/main/MainShareFragment.kt index 42077a648dc2627b9084d84a3435bc8a813f54e5..52c0e3df59de90639ce0c92aec3f62300e00934d 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/main/MainShareFragment.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/main/MainShareFragment.kt @@ -4,6 +4,7 @@ import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import android.view.accessibility.AccessibilityEvent import androidx.fragment.app.Fragment import androidx.fragment.app.activityViewModels import de.rki.coronawarnapp.R @@ -55,4 +56,9 @@ class MainShareFragment : Fragment() { (activity as MainActivity).goBack() } } + + override fun onResume() { + super.onResume() + binding.mainShareContainer.sendAccessibilityEvent(AccessibilityEvent.TYPE_ANNOUNCEMENT) + } } diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/onboarding/OnboardingFragment.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/onboarding/OnboardingFragment.kt index 13925c8779ab03bf2c25a47aa4597ad81b421a99..ace481434d72a43119d9f3f4328f95c3a362d513 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/onboarding/OnboardingFragment.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/onboarding/OnboardingFragment.kt @@ -44,13 +44,8 @@ class OnboardingFragment : Fragment() { } } - override fun onStart() { - super.onStart() - binding.onboardingContainer.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_FOCUSED) - } - override fun onResume() { super.onResume() - binding.onboardingContainer.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_FOCUSED) + binding.onboardingContainer.sendAccessibilityEvent(AccessibilityEvent.TYPE_ANNOUNCEMENT) } } diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/onboarding/OnboardingNotificationsFragment.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/onboarding/OnboardingNotificationsFragment.kt index a89d179d5c73fe57e2df6d0243b8dfc0716e51f5..c6768a15f48d752bc6b7ce8ba8022a4eee645790 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/onboarding/OnboardingNotificationsFragment.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/onboarding/OnboardingNotificationsFragment.kt @@ -43,14 +43,9 @@ class OnboardingNotificationsFragment : Fragment() { setButtonOnClickListener() } - override fun onStart() { - super.onStart() - binding.onboardingNotificationsContainer.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_FOCUSED) - } - override fun onResume() { super.onResume() - binding.onboardingNotificationsContainer.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_FOCUSED) + binding.onboardingNotificationsContainer.sendAccessibilityEvent(AccessibilityEvent.TYPE_ANNOUNCEMENT) } private fun setButtonOnClickListener() { diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/onboarding/OnboardingPrivacyFragment.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/onboarding/OnboardingPrivacyFragment.kt index 9e40aefe05876ed0be20547cf622bbd804001ccc..f15cbfbde6c084c29ee22e40add187f5ef94f49a 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/onboarding/OnboardingPrivacyFragment.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/onboarding/OnboardingPrivacyFragment.kt @@ -40,14 +40,9 @@ class OnboardingPrivacyFragment : Fragment() { setButtonOnClickListener() } - override fun onStart() { - super.onStart() - binding.onboardingPrivacyContainer.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_FOCUSED) - } - override fun onResume() { super.onResume() - binding.onboardingPrivacyContainer.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_FOCUSED) + binding.onboardingPrivacyContainer.sendAccessibilityEvent(AccessibilityEvent.TYPE_ANNOUNCEMENT) } private fun setButtonOnClickListener() { diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/onboarding/OnboardingTestFragment.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/onboarding/OnboardingTestFragment.kt index a95516e58c42d2b91846b9f1ad30fec44438ba26..2923d9ea0f06dbc570783d41a99d0b24b6b9b5f6 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/onboarding/OnboardingTestFragment.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/onboarding/OnboardingTestFragment.kt @@ -40,14 +40,9 @@ class OnboardingTestFragment : Fragment() { setButtonOnClickListener() } - override fun onStart() { - super.onStart() - binding.onboardingTestContainer.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_FOCUSED) - } - override fun onResume() { super.onResume() - binding.onboardingTestContainer.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_FOCUSED) + binding.onboardingTestContainer.sendAccessibilityEvent(AccessibilityEvent.TYPE_ANNOUNCEMENT) } private fun setButtonOnClickListener() { diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/onboarding/OnboardingTracingFragment.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/onboarding/OnboardingTracingFragment.kt index 21115e9166b27435d3ff282fc3214c5a473afe1e..23f302095ecfca1dc2fc645a8751af08b5535140 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/onboarding/OnboardingTracingFragment.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/onboarding/OnboardingTracingFragment.kt @@ -70,14 +70,9 @@ class OnboardingTracingFragment : Fragment(), setButtonOnClickListener() } - override fun onStart() { - super.onStart() - binding.onboardingTracingContainer.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_FOCUSED) - } - override fun onResume() { super.onResume() - binding.onboardingTracingContainer.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_FOCUSED) + binding.onboardingTracingContainer.sendAccessibilityEvent(AccessibilityEvent.TYPE_ANNOUNCEMENT) resetTracing() } diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/riskdetails/RiskDetailsFragment.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/riskdetails/RiskDetailsFragment.kt index 8f6f5a752b2798f7bcc9061d2ab313b92467c0bd..a36fcd300f59a5302a4bf9f90d0d71559b059ee0 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/riskdetails/RiskDetailsFragment.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/riskdetails/RiskDetailsFragment.kt @@ -54,11 +54,6 @@ class RiskDetailsFragment : Fragment() { setButtonOnClickListeners() } - override fun onStart() { - super.onStart() - binding.riskDetailsContainer.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_FOCUSED) - } - override fun onResume() { super.onResume() // refresh required data @@ -66,7 +61,7 @@ class RiskDetailsFragment : Fragment() { tracingViewModel.refreshExposureSummary() tracingViewModel.refreshLastTimeDiagnosisKeysFetchedDate() TimerHelper.checkManualKeyRetrievalTimer() - binding.riskDetailsContainer.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_FOCUSED) + binding.riskDetailsContainer.sendAccessibilityEvent(AccessibilityEvent.TYPE_ANNOUNCEMENT) } private fun setButtonOnClickListeners() { diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/settings/SettingsFragment.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/settings/SettingsFragment.kt index 9460bfe99ffc5a182e021d46780f16e3fdffc295..3c7e49013be8a55229817a5a96824722b5a3a233 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/settings/SettingsFragment.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/settings/SettingsFragment.kt @@ -4,6 +4,7 @@ import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import android.view.accessibility.AccessibilityEvent import androidx.fragment.app.Fragment import androidx.fragment.app.activityViewModels import androidx.navigation.fragment.findNavController @@ -59,6 +60,8 @@ class SettingsFragment : Fragment() { settingsViewModel.refreshNotificationsEnabled(requireContext()) settingsViewModel.refreshNotificationsRiskEnabled() settingsViewModel.refreshNotificationsTestEnabled() + + binding.settingsContainer.sendAccessibilityEvent(AccessibilityEvent.TYPE_ANNOUNCEMENT) } private fun setButtonOnClickListener() { diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/settings/SettingsNotificationFragment.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/settings/SettingsNotificationFragment.kt index 99ca01e18c9d45eab743cd55361167f2fbc94fae..2baecf1273c0bc4f540e901a4cb39c37a9d67549 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/settings/SettingsNotificationFragment.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/settings/SettingsNotificationFragment.kt @@ -4,6 +4,7 @@ import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import android.view.accessibility.AccessibilityEvent import androidx.fragment.app.Fragment import androidx.fragment.app.activityViewModels import de.rki.coronawarnapp.databinding.FragmentSettingsNotificationsBinding @@ -52,6 +53,7 @@ class SettingsNotificationFragment : Fragment() { override fun onResume() { super.onResume() + binding.settingsNotificationsContainer.sendAccessibilityEvent(AccessibilityEvent.TYPE_ANNOUNCEMENT) // refresh required data settingsViewModel.refreshNotificationsEnabled(requireContext()) settingsViewModel.refreshNotificationsRiskEnabled() @@ -70,18 +72,12 @@ class SettingsNotificationFragment : Fragment() { val goBack = binding.settingsNotificationsHeader.headerButtonBack.buttonIcon // Update Risk - updateRiskNotificationSwitch.setOnCheckedChangeListener { _, _ -> - // android calls this listener also on start, so it has to be verified if the user pressed the switch - if (updateRiskNotificationSwitch.isPressed) { - settingsViewModel.toggleNotificationsRiskEnabled() - } + updateRiskNotificationSwitch.setOnClickListener { + settingsViewModel.toggleNotificationsRiskEnabled() } // Update Test - updateTestNotificationSwitch.setOnCheckedChangeListener { _, _ -> - // android calls this listener also on start, so it has to be verified if the user pressed the switch - if (updateTestNotificationSwitch.isPressed) { - settingsViewModel.toggleNotificationsTestEnabled() - } + updateTestNotificationSwitch.setOnClickListener { + settingsViewModel.toggleNotificationsTestEnabled() } goBack.setOnClickListener { (activity as MainActivity).goBack() diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/settings/SettingsResetFragment.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/settings/SettingsResetFragment.kt index cb9ddd031d99ed87b741cb12e7943c5d21a139cd..38fb5df781d0f26725a8cbfb5f313167f4539909 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/settings/SettingsResetFragment.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/settings/SettingsResetFragment.kt @@ -1,13 +1,16 @@ package de.rki.coronawarnapp.ui.settings +import android.app.AlertDialog import android.content.Intent import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import android.view.accessibility.AccessibilityEvent import androidx.fragment.app.Fragment import androidx.lifecycle.lifecycleScope import com.google.android.gms.common.api.ApiException +import de.rki.coronawarnapp.R import de.rki.coronawarnapp.databinding.FragmentSettingsResetBinding import de.rki.coronawarnapp.exception.ExceptionCategory import de.rki.coronawarnapp.exception.reporting.report @@ -15,6 +18,7 @@ import de.rki.coronawarnapp.nearby.InternalExposureNotificationClient import de.rki.coronawarnapp.ui.main.MainActivity import de.rki.coronawarnapp.ui.onboarding.OnboardingActivity import de.rki.coronawarnapp.util.DataRetentionHelper +import de.rki.coronawarnapp.util.DialogHelper import de.rki.coronawarnapp.worker.BackgroundWorkScheduler import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch @@ -50,7 +54,7 @@ class SettingsResetFragment : Fragment() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) binding.settingsResetButtonDelete.setOnClickListener { - deleteAllAppContent() + confirmReset() } binding.settingsResetButtonCancel.setOnClickListener { (activity as MainActivity).goBack() @@ -60,6 +64,11 @@ class SettingsResetFragment : Fragment() { } } + override fun onResume() { + super.onResume() + binding.settingsResetContainer.sendAccessibilityEvent(AccessibilityEvent.TYPE_ANNOUNCEMENT) + } + private fun deleteAllAppContent() { lifecycleScope.launch { try { @@ -89,4 +98,22 @@ class SettingsResetFragment : Fragment() { private fun deleteLocalAppContent() { DataRetentionHelper.clearAllLocalData(requireContext()) } + + private fun confirmReset() { + val resetDialog = DialogHelper.DialogInstance( + requireActivity(), + R.string.settings_reset_dialog_headline, + R.string.settings_reset_dialog_body, + R.string.settings_reset_dialog_button_confirm, + R.string.settings_reset_dialog_button_cancel, + true, + { + deleteAllAppContent() + } + ) + + DialogHelper.showDialog(resetDialog).apply { + getButton(AlertDialog.BUTTON_POSITIVE).setTextColor(context.getColor(R.color.colorTextSemanticRed)) + } + } } diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/settings/SettingsTracingFragment.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/settings/SettingsTracingFragment.kt index a1842b99820b0dc3ca3aafcb59a7e2a09e914b69..c2390c53934f19b59cd874e6c890433efbdb3601 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/settings/SettingsTracingFragment.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/settings/SettingsTracingFragment.kt @@ -5,6 +5,7 @@ import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import android.view.accessibility.AccessibilityEvent import androidx.fragment.app.Fragment import androidx.fragment.app.activityViewModels import androidx.lifecycle.lifecycleScope @@ -15,7 +16,6 @@ import de.rki.coronawarnapp.exception.reporting.report import de.rki.coronawarnapp.nearby.InternalExposureNotificationClient import de.rki.coronawarnapp.nearby.InternalExposureNotificationPermissionHelper import de.rki.coronawarnapp.storage.LocalData -import de.rki.coronawarnapp.ui.ViewBlocker import de.rki.coronawarnapp.ui.main.MainActivity import de.rki.coronawarnapp.ui.viewmodel.SettingsViewModel import de.rki.coronawarnapp.ui.viewmodel.TracingViewModel @@ -72,6 +72,7 @@ class SettingsTracingFragment : Fragment(), super.onResume() // refresh required data tracingViewModel.refreshIsTracingEnabled() + binding.settingsTracingContainer.sendAccessibilityEvent(AccessibilityEvent.TYPE_ANNOUNCEMENT) } override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { @@ -93,23 +94,21 @@ class SettingsTracingFragment : Fragment(), private fun setButtonOnClickListener() { val switch = binding.settingsTracingSwitchRow.settingsSwitchRowSwitch + val back = binding.settingsTracingHeader.headerButtonBack.buttonIcon + val bluetooth = binding.settingsTracingStatusBluetooth.tracingStatusCardButton + val connection = binding.settingsTracingStatusConnection.tracingStatusCardButton internalExposureNotificationPermissionHelper = InternalExposureNotificationPermissionHelper(this, this) - switch.setOnCheckedChangeListener { _, _ -> - // android calls this listener also on start, so it has to be verified if the user pressed the switch - if (switch.isPressed) { - ViewBlocker.runAndBlockInteraction(arrayOf(switch)) { - startStopTracing() - } - } + switch.setOnClickListener { + startStopTracing() } - binding.settingsTracingHeader.headerButtonBack.buttonIcon.setOnClickListener { + back.setOnClickListener { (activity as MainActivity).goBack() } - binding.settingsTracingStatusBluetooth.tracingStatusCardButton.setOnClickListener { + bluetooth.setOnClickListener { ExternalActionHelper.toMainSettings(requireContext()) } - binding.settingsTracingStatusConnection.tracingStatusCardButton.setOnClickListener { + connection.setOnClickListener { ExternalActionHelper.toConnections(requireContext()) } } diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/SubmissionContactFragment.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/SubmissionContactFragment.kt index d61a15600b1fbfd27f491425f993110a486615dd..de00ac35c343d7861c46fd7b122d75b4affb023a 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/SubmissionContactFragment.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/SubmissionContactFragment.kt @@ -41,14 +41,9 @@ class SubmissionContactFragment : Fragment() { setButtonOnClickListener() } - override fun onStart() { - super.onStart() - binding.submissionContactRoot.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_FOCUSED) - } - override fun onResume() { super.onResume() - binding.submissionContactRoot.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_FOCUSED) + binding.submissionContactRoot.sendAccessibilityEvent(AccessibilityEvent.TYPE_ANNOUNCEMENT) } private fun setButtonOnClickListener() { diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/SubmissionDispatcherFragment.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/SubmissionDispatcherFragment.kt index dbc66ff1006c4a2aff97fa676cab379b4731d2ed..0ae9e32603cac3dedd9e3797f9cd3a05c80fe1ea 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/SubmissionDispatcherFragment.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/SubmissionDispatcherFragment.kt @@ -42,14 +42,9 @@ class SubmissionDispatcherFragment : Fragment() { setButtonOnClickListener() } - override fun onStart() { - super.onStart() - binding.submissionDispatcherRoot.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_FOCUSED) - } - override fun onResume() { super.onResume() - binding.submissionDispatcherRoot.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_FOCUSED) + binding.submissionDispatcherRoot.sendAccessibilityEvent(AccessibilityEvent.TYPE_ANNOUNCEMENT) } private fun setButtonOnClickListener() { diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/SubmissionDoneFragment.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/SubmissionDoneFragment.kt index dfcc635eb8ba8fc09f2d16eb00f8f7a5657fd451..5efab5ef21f2333b8737bb6d5b80140614a996ba 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/SubmissionDoneFragment.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/SubmissionDoneFragment.kt @@ -4,6 +4,7 @@ import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import android.view.accessibility.AccessibilityEvent import androidx.fragment.app.Fragment import androidx.navigation.fragment.findNavController import de.rki.coronawarnapp.databinding.FragmentSubmissionDoneBinding @@ -37,6 +38,11 @@ class SubmissionDoneFragment : Fragment() { setButtonOnClickListener() } + override fun onResume() { + super.onResume() + binding.submissionDoneContainer.sendAccessibilityEvent(AccessibilityEvent.TYPE_ANNOUNCEMENT) + } + private fun setButtonOnClickListener() { binding.submissionDoneHeader.headerButtonBack.buttonIcon.setOnClickListener { findNavController().doNavigate( diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/SubmissionIntroFragment.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/SubmissionIntroFragment.kt index 5c688523b104795de2561f6c2fb47ff3cdeb23f7..3ad69bd6b9a2b6883013917664c96e2646d5ab02 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/SubmissionIntroFragment.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/SubmissionIntroFragment.kt @@ -38,14 +38,9 @@ class SubmissionIntroFragment : Fragment() { setButtonOnClickListener() } - override fun onStart() { - super.onStart() - binding.submissionIntroRoot.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_FOCUSED) - } - override fun onResume() { super.onResume() - binding.submissionIntroRoot.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_FOCUSED) + binding.submissionIntroRoot.sendAccessibilityEvent(AccessibilityEvent.TYPE_ANNOUNCEMENT) } private fun setButtonOnClickListener() { diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/SubmissionQRCodeScanFragment.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/SubmissionQRCodeScanFragment.kt index 3a92abbf6909357658eaa60e4599a5b87e98d136..0d4e8262138fb0d0efb24b92e4c201b98e57c14d 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/SubmissionQRCodeScanFragment.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/SubmissionQRCodeScanFragment.kt @@ -1,10 +1,12 @@ package de.rki.coronawarnapp.ui.submission import android.Manifest +import android.content.pm.PackageManager import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import android.view.accessibility.AccessibilityEvent import androidx.fragment.app.Fragment import androidx.fragment.app.activityViewModels import androidx.navigation.fragment.findNavController @@ -37,6 +39,7 @@ class SubmissionQRCodeScanFragment : Fragment() { private val viewModel: SubmissionViewModel by activityViewModels() private var _binding: FragmentSubmissionQrCodeScanBinding? = null private val binding: FragmentSubmissionQrCodeScanBinding get() = _binding!! + private var showsPermissionDialog = false override fun onCreateView( inflater: LayoutInflater, @@ -111,14 +114,6 @@ class SubmissionQRCodeScanFragment : Fragment() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - if (!CameraPermissionHelper.hasCameraPermission(requireActivity())) { - if (shouldShowRequestPermissionRationale(Manifest.permission.CAMERA)) { - showCameraPermissionRationaleDialog() - } else { - requestCameraPermission() - } - } - binding.submissionQrCodeScanTorch.setOnCheckedChangeListener { _, isChecked -> binding.submissionQrCodeScanPreview.setTorch( isChecked @@ -183,13 +178,58 @@ class SubmissionQRCodeScanFragment : Fragment() { DialogHelper.showDialog(invalidScanDialogInstance) } + override fun onRequestPermissionsResult( + requestCode: Int, + permissions: Array<String>, + grantResults: IntArray + ) { + if (requestCode == REQUEST_CAMERA_PERMISSION_CODE) { + + // permission was denied + if ((grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_DENIED)) { + if (shouldShowRequestPermissionRationale(Manifest.permission.CAMERA)) { + showCameraPermissionRationaleDialog() + } else { + // user permanently denied access to the camera + showCameraPermissionDeniedDialog() + } + } + } + } + override fun onResume() { super.onResume() + binding.submissionQrCodeScanContainer.sendAccessibilityEvent(AccessibilityEvent.TYPE_ANNOUNCEMENT) if (CameraPermissionHelper.hasCameraPermission(requireActivity())) { binding.submissionQrCodeScanPreview.resume() startDecode() + return } + + // we might already show a rational dialog (e.g. when onRequestPermissionsResult was denied + // then do nothing + if (showsPermissionDialog) { + return + } + + requestCameraPermission() + } + + private fun showCameraPermissionDeniedDialog() { + val permissionDeniedDialog = DialogHelper.DialogInstance( + requireActivity(), + R.string.submission_qr_code_scan_permission_denied_dialog_headline, + R.string.submission_qr_code_scan_permission_denied_dialog_body, + R.string.submission_qr_code_scan_permission_denied_dialog_button, + cancelable = false, + positiveButtonFunction = { + showsPermissionDialog = false + goBack() + } + ) + showsPermissionDialog = true + DialogHelper.showDialog(permissionDeniedDialog) } private fun showCameraPermissionRationaleDialog() { @@ -201,13 +241,16 @@ class SubmissionQRCodeScanFragment : Fragment() { R.string.submission_qr_code_scan_permission_rationale_dialog_button_negative, false, { + showsPermissionDialog = false requestCameraPermission() }, { + showsPermissionDialog = false goBack() } ) + showsPermissionDialog = true DialogHelper.showDialog(cameraPermissionRationaleDialogInstance) } diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/SubmissionResultPositiveOtherWarningFragment.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/SubmissionResultPositiveOtherWarningFragment.kt index 312e91b419c791d1e40d9c2f0a69adab534f24ac..92c15d7fcc3c1004d61795872581049075b4e6c7 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/SubmissionResultPositiveOtherWarningFragment.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/SubmissionResultPositiveOtherWarningFragment.kt @@ -5,6 +5,7 @@ import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import android.view.accessibility.AccessibilityEvent import androidx.fragment.app.Fragment import androidx.fragment.app.activityViewModels import androidx.navigation.fragment.findNavController @@ -41,6 +42,7 @@ class SubmissionResultPositiveOtherWarningFragment : Fragment(), override fun onResume() { super.onResume() + binding.submissionPositiveOtherPrivacyContainer.sendAccessibilityEvent(AccessibilityEvent.TYPE_ANNOUNCEMENT) tracingViewModel.refreshIsTracingEnabled() if (submissionRequested && !submissionFailed) { internalExposureNotificationPermissionHelper.requestPermissionToShareKeys() diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/SubmissionTanFragment.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/SubmissionTanFragment.kt index 381ee51522c33f221b4de8eded7e901818965c62..ea5639dcf24bd5623df3b9c46def5c4671769445 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/SubmissionTanFragment.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/SubmissionTanFragment.kt @@ -7,6 +7,7 @@ import android.view.ViewGroup import android.view.accessibility.AccessibilityEvent import androidx.fragment.app.Fragment import androidx.fragment.app.activityViewModels +import androidx.fragment.app.viewModels import androidx.navigation.fragment.findNavController import de.rki.coronawarnapp.R import de.rki.coronawarnapp.databinding.FragmentSubmissionTanBinding @@ -18,14 +19,17 @@ import de.rki.coronawarnapp.ui.doNavigate import de.rki.coronawarnapp.ui.main.MainActivity import de.rki.coronawarnapp.ui.viewmodel.SubmissionViewModel import de.rki.coronawarnapp.util.DialogHelper +import de.rki.coronawarnapp.util.TanHelper import de.rki.coronawarnapp.util.observeEvent +import kotlinx.android.synthetic.main.include_submission_tan.submission_tan_error +import kotlinx.android.synthetic.main.include_submission_tan.submission_tan_character_error /** * Fragment for TAN entry */ class SubmissionTanFragment : Fragment() { - private val viewModel: SubmissionTanViewModel by activityViewModels() + private val viewModel: SubmissionTanViewModel by viewModels() private val submissionViewModel: SubmissionViewModel by activityViewModels() private var _binding: FragmentSubmissionTanBinding? = null private val binding: FragmentSubmissionTanBinding get() = _binding!! @@ -97,8 +101,20 @@ class SubmissionTanFragment : Fragment() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - binding.submissionTanContent.submissionTanInput.listener = - { tan -> viewModel.tan.value = tan } + binding.submissionTanContent.submissionTanInput.listener = { tan -> + resetError() + + viewModel.tan.value = tan + + if (tan != null) { + if (!TanHelper.allCharactersValid(tan)) + showCharacterError() + + if (tan.length == TanConstants.MAX_LENGTH && !TanHelper.isChecksumValid(tan)) + showTanError() + } + } + binding.submissionTanButtonEnter.setOnClickListener { storeTanAndContinue() } binding.submissionTanHeader.headerButtonBack.buttonIcon.setOnClickListener { goBack() } @@ -120,14 +136,22 @@ class SubmissionTanFragment : Fragment() { }) } - override fun onStart() { - super.onStart() - binding.submissionTanRoot.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_FOCUSED) + private fun resetError() { + submission_tan_character_error.visibility = View.GONE + submission_tan_error.visibility = View.GONE + } + + private fun showCharacterError() { + submission_tan_character_error.visibility = View.VISIBLE + } + + private fun showTanError() { + submission_tan_error.visibility = View.VISIBLE } override fun onResume() { super.onResume() - binding.submissionTanRoot.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_FOCUSED) + binding.submissionTanRoot.sendAccessibilityEvent(AccessibilityEvent.TYPE_ANNOUNCEMENT) } private fun goBack() = (activity as MainActivity).goBack() diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/SubmissionTanViewModel.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/SubmissionTanViewModel.kt index e42d6c9a2cffd5d8aabe28d4cbca5c6a2b4dd3a2..849aebddf36ed17417e72c4ad8c73c1506ca0fc0 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/SubmissionTanViewModel.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/SubmissionTanViewModel.kt @@ -23,17 +23,6 @@ class SubmissionTanViewModel : ViewModel() { TanHelper.allCharactersValid(it) } - val tanChecksumValid = - Transformations.map(tan) { - ((it !== null && it.trim().length == TanConstants.MAX_LENGTH) && - TanHelper.isChecksumValid(it).not()).not() - } - - val tanCharactersValid = - Transformations.map(tan) { - !((it != null) && TanHelper.allCharactersValid(it).not()) - } - fun storeTeletan() { val teletan = tan.value!! Timber.d("Storing teletan $teletan") diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/SubmissionTestResultFragment.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/SubmissionTestResultFragment.kt index cbea694ff9f25e30cab96a2eb16185ec81bda890..964b0feba9fd75fbceda74c59b6c5536fd616970 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/SubmissionTestResultFragment.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/SubmissionTestResultFragment.kt @@ -5,6 +5,8 @@ import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import android.view.accessibility.AccessibilityEvent +import androidx.activity.OnBackPressedCallback import androidx.fragment.app.Fragment import androidx.fragment.app.activityViewModels import androidx.navigation.fragment.findNavController @@ -33,6 +35,16 @@ class SubmissionTestResultFragment : Fragment() { private var _binding: FragmentSubmissionTestResultBinding? = null private val binding: FragmentSubmissionTestResultBinding get() = _binding!! + // Overrides default back behaviour + private val backCallback: OnBackPressedCallback = + object : OnBackPressedCallback(true) { + override fun handleOnBackPressed() { + findNavController().doNavigate( + SubmissionTestResultFragmentDirections.actionSubmissionResultFragmentToMainFragment() + ) + } + } + override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, @@ -42,6 +54,8 @@ class SubmissionTestResultFragment : Fragment() { _binding = FragmentSubmissionTestResultBinding.inflate(inflater) binding.submissionViewModel = submissionViewModel binding.lifecycleOwner = this + // registers callback when the os level back is pressed + requireActivity().onBackPressedDispatcher.addCallback(viewLifecycleOwner, backCallback) // Inflate the layout for this fragment return binding.root } @@ -105,6 +119,7 @@ class SubmissionTestResultFragment : Fragment() { override fun onResume() { super.onResume() + binding.submissionTestResultContainer.sendAccessibilityEvent(AccessibilityEvent.TYPE_ANNOUNCEMENT) submissionViewModel.refreshDeviceUIState() tracingViewModel.refreshIsTracingEnabled() } diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/view/TanInput.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/view/TanInput.kt index 4f1ee0e9aa14cacdbd4f438b67a130be686b6471..91a3e227e730b652d2a98bdb9cf2b9f915358106 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/view/TanInput.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/view/TanInput.kt @@ -9,11 +9,11 @@ import android.view.inputmethod.InputMethodManager import android.widget.EditText import android.widget.LinearLayout import android.widget.TextView +import androidx.annotation.DimenRes import androidx.core.view.children import androidx.core.widget.doOnTextChanged import de.rki.coronawarnapp.R import de.rki.coronawarnapp.ui.submission.TanConstants -import de.rki.coronawarnapp.ui.submission.TanConstants.MAX_LENGTH import de.rki.coronawarnapp.util.TanHelper import kotlinx.android.synthetic.main.view_tan_input_edittext.view.tan_input_edittext import java.util.Locale @@ -24,6 +24,12 @@ class TanInput(context: Context, attrs: AttributeSet) : ViewGroup(context, attrs companion object { private const val KEYBOARD_TRIGGER_DELAY = 100L private const val EMPTY_STRING = "" + + private const val GROUP_SPACING_COUNT = 2 + private const val DIGIT_SPACING_COUNT = 7 + private const val DIGIT_COUNT = 10 + + private const val WIDTH_HEIGHT_RATIO = (32.0 / 24.0) } private val whitespaceFilter = @@ -33,7 +39,7 @@ class TanInput(context: Context, attrs: AttributeSet) : ViewGroup(context, attrs TanConstants.ALPHA_NUMERIC_CHARS.contains(it) } } - private var lengthFilter = InputFilter.LengthFilter(MAX_LENGTH) + private var lengthFilter = InputFilter.LengthFilter(TanConstants.MAX_LENGTH) var listener: ((String?) -> Unit)? = null @@ -50,7 +56,7 @@ class TanInput(context: Context, attrs: AttributeSet) : ViewGroup(context, attrs inflate(context, R.layout.view_tan_input_group_3, this) inflate(context, R.layout.view_tan_input_group_4, this) - lineSpacing = context.resources.getDimension(R.dimen.submission_tan_line_spacing).toInt() + lineSpacing = getDimension(R.dimen.submission_tan_line_spacing).toInt() tan_input_edittext.filters = arrayOf(whitespaceFilter, alphaNumericFilter, lengthFilter) @@ -71,20 +77,9 @@ class TanInput(context: Context, attrs: AttributeSet) : ViewGroup(context, attrs } } - private fun limitLength(length: Int?) { - lengthFilter = InputFilter.LengthFilter(if (length != null) length else MAX_LENGTH) - tan_input_edittext.filters = arrayOf(whitespaceFilter, alphaNumericFilter, lengthFilter) - } - private fun updateTan(text: CharSequence?) { this.tan = text?.toString()?.toUpperCase(Locale.ROOT) updateDigits() - tan?.let { - limitLength( - if (TanHelper.allCharactersValid(it)) null - else it.length - ) - } notifyListener() } @@ -125,6 +120,17 @@ class TanInput(context: Context, attrs: AttributeSet) : ViewGroup(context, attrs val availableWith = MeasureSpec.getSize(widthMeasureSpec) + // calculate digit dimensions based on available width and text size + val textSize = digits().first().textSize + + val (digitWidth, digitHeight) = calculateDigitDimension(availableWith, textSize.toInt()) + + // adjust digits to calculated width/height + digits().forEach { + it.layoutParams.width = digitWidth + it.layoutParams.height = digitHeight + } + var lines = 1 var remainingWidthInLine = availableWith var longestLineWidth = 0 @@ -192,4 +198,36 @@ class TanInput(context: Context, attrs: AttributeSet) : ViewGroup(context, attrs child.layout(childStart, childTop, childEnd, childBottom) } } + + // calculate digit digit width + // digits should take as much space as possible, limited by min and max digit width + // spaces between digits and separators stay constant + // digits are displayed in xxx - xxx - xxxx pattern + private fun calculateDigitDimension(availableWith: Int, textSize: Int): Pair<Int, Int> { + val widthRequiredForSpacing = + (DIGIT_SPACING_COUNT * getDimension(R.dimen.submission_tan_total_digit_spacing)) + + (GROUP_SPACING_COUNT * getDimension(R.dimen.submission_tan_total_group_spacing)) + + val remainingWidthForDigits = availableWith - widthRequiredForSpacing + + val digitWidth = (remainingWidthForDigits / DIGIT_COUNT).coerceIn( + getDimension(R.dimen.submission_tan_input_digit_min_width), + getDimension(R.dimen.submission_tan_input_digit_max_width) + ).toInt() + + // digit should have fixed width/height ratio + val digitHeight = (WIDTH_HEIGHT_RATIO * digitWidth).toInt() + + // is the calculated height enough to display with the text properly? + val requiredHeightForText = textSize * 1.3 // text size + some spacing + if (digitHeight < requiredHeightForText) { + val correctedHeight = requiredHeightForText.toInt() + val correctedWidth = (correctedHeight * (1 / WIDTH_HEIGHT_RATIO)).toInt() + return correctedWidth to correctedHeight + } + + return digitWidth to digitHeight + } + + private fun getDimension(@DimenRes dimension: Int) = context.resources.getDimension(dimension) } diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/viewmodel/TracingViewModel.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/viewmodel/TracingViewModel.kt index f45b0645da3b03bb1a4e11d4ad1d39c68e2b10fe..4ca35e356fb61fa2a1d7999d0f3822b3cf6e6709 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/viewmodel/TracingViewModel.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/viewmodel/TracingViewModel.kt @@ -30,7 +30,6 @@ class TracingViewModel : ViewModel() { val TAG: String? = TracingViewModel::class.simpleName } - // TODO: comments for variables // Values from RiskLevelRepository val riskLevel: LiveData<Int> = RiskLevelRepository.riskLevelScore val riskLevelScoreLastSuccessfulCalculated = diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/ExternalActionHelper.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/ExternalActionHelper.kt index a44561a30670eb08f7ee4de1218ce5f7c20fd8da..390b8a9896856dd9650429b7de04afd85e6bfb8a 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/ExternalActionHelper.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/ExternalActionHelper.kt @@ -110,7 +110,6 @@ object ExternalActionHelper { * * @param context */ - // todo has to be tested on API23 on a device fun toNotifications(context: Context) { try { val intent = Intent() @@ -155,5 +154,4 @@ object ExternalActionHelper { ) } } - // todo navigate storage settings } diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/formatter/FormatterHelper.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/formatter/FormatterHelper.kt index c826961f01ce619e5081157b8670546bfe38b9a5..0d5ec67d285f3ea996339ad439fdaffa81c78f89 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/formatter/FormatterHelper.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/formatter/FormatterHelper.kt @@ -138,7 +138,8 @@ fun formatStringAsHTMLFromLocal(path: String): Spanned { } /** - * TODO + * Formats divider color depending on resource value + * Returns colorHairline as default * * @param color * @return diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/formatter/FormatterSettingsHelper.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/formatter/FormatterSettingsHelper.kt index fbaea2c319efae910d7aa3ffcd7cdc0e58f343f8..685ab248557f04c4b65a5fff2293aed962263540 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/formatter/FormatterSettingsHelper.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/formatter/FormatterSettingsHelper.kt @@ -87,6 +87,15 @@ fun formatTracingStatusText(tracing: Boolean, bluetooth: Boolean, connection: Bo } } +/** + * Returns a combined string of subtitle and status for the content description for switches + * + * @param subtitle + * @param status + * @return String + */ +fun formatSwitchContentDescription(subtitle: String, status: String): String = "$subtitle $status" + /** * Format the settings tracing description text display depending on tracing status * diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/formatter/FormatterSubmissionHelper.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/formatter/FormatterSubmissionHelper.kt index 9914230ef3223636adf1da25d48341860007b7a9..10004cdffc7d5f33c48d8507ab3e35a78c40de9c 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/formatter/FormatterSubmissionHelper.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/formatter/FormatterSubmissionHelper.kt @@ -146,7 +146,6 @@ fun formatSubmissionStatusCardContentStatusTextVisible(uiState: DeviceUIState?): fun formatSubmissionStatusCardContentIcon(uiState: DeviceUIState?): Drawable? { val appContext = CoronaWarnApplication.getAppContext() - // TODO Replace with real drawables when design is finished return when (uiState) { DeviceUIState.PAIRED_NO_RESULT -> appContext.getDrawable(R.drawable.ic_main_illustration_pending) DeviceUIState.PAIRED_POSITIVE, diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/formatter/FromatterAccessibilityHelper.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/formatter/FromatterAccessibilityHelper.kt new file mode 100644 index 0000000000000000000000000000000000000000..987e0f5baafbe661fef8671541f22926a597ecea --- /dev/null +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/formatter/FromatterAccessibilityHelper.kt @@ -0,0 +1,17 @@ +@file:JvmName("FormatterAccessibilityHelper") + +package de.rki.coronawarnapp.util.formatter + +import de.rki.coronawarnapp.CoronaWarnApplication +import de.rki.coronawarnapp.R + +fun formatSuffix(string: String?, suffix: Int): String { + val appContext = CoronaWarnApplication.getAppContext() + return if (string != null) { + "$string ${appContext.getString(suffix)}" + } else "" +} + +fun formatButton(string: String?): String = formatSuffix(string, R.string.suffix_button) + +fun formatImage(string: String?): String = formatSuffix(string, R.string.suffix_image) diff --git a/Corona-Warn-App/src/main/res/drawable-night/ic_test_result_illustration_positive.xml b/Corona-Warn-App/src/main/res/drawable-night/ic_test_result_illustration_positive.xml index 0de3ca0c9fd31a57617ebf0ff343a85d86a8cb27..5803fc257c6f04a227587f78d2c597554bd03fa5 100644 --- a/Corona-Warn-App/src/main/res/drawable-night/ic_test_result_illustration_positive.xml +++ b/Corona-Warn-App/src/main/res/drawable-night/ic_test_result_illustration_positive.xml @@ -5,121 +5,121 @@ android:viewportHeight="112"> <group> <path - android:pathData="M8.615,17.425l0,94.575l70.324,0l0,-76.558l-16.886,-18.017z" + android:pathData="M8.615,17.767l0,93.738l70.324,0l0,-75.88l-16.886,-17.858z" android:strokeWidth="1" - android:fillColor="#3F3F43" + android:fillColor="#232324" android:fillType="nonZero" android:strokeColor="#00000000"/> <path - android:pathData="M62.097,35.442l16.786,0l-16.786,-18.003z" + android:pathData="M62.097,35.624l16.786,0l-16.786,-17.844z" android:strokeWidth="1" android:fillColor="#B8C8D9" android:fillType="nonZero" android:strokeColor="#00000000"/> <path - android:pathData="M35.826,99.05L29.418,99.05C28.326,99.05 27.441,98.154 27.441,97.048L27.441,90.56C27.441,89.453 28.326,88.558 29.418,88.558L35.826,88.558C36.919,88.558 37.803,89.453 37.803,90.56L37.803,97.048C37.803,98.154 36.919,99.05 35.826,99.05" + android:pathData="M35.826,98.669L29.418,98.669C28.326,98.669 27.441,97.781 27.441,96.684L27.441,90.254C27.441,89.157 28.326,88.27 29.418,88.27L35.826,88.27C36.919,88.27 37.803,89.157 37.803,90.254L37.803,96.684C37.803,97.781 36.919,98.669 35.826,98.669" android:strokeWidth="1" android:fillColor="#FF919A" android:fillType="nonZero" android:strokeColor="#00000000"/> <path - android:pathData="M60.851,99.05L54.44,99.05C53.349,99.05 52.464,98.154 52.464,97.049L52.464,90.558C52.464,89.453 53.349,88.558 54.44,88.558L60.851,88.558C61.942,88.558 62.827,89.453 62.827,90.558L62.827,97.049C62.827,98.154 61.942,99.05 60.851,99.05" + android:pathData="M60.851,98.669L54.44,98.669C53.349,98.669 52.464,97.781 52.464,96.685L52.464,90.252C52.464,89.157 53.349,88.27 54.44,88.27L60.851,88.27C61.942,88.27 62.827,89.157 62.827,90.252L62.827,96.685C62.827,97.781 61.942,98.669 60.851,98.669" android:strokeWidth="1" android:fillColor="#B8C8D9" android:fillType="nonZero" android:strokeColor="#00000000"/> <path - android:pathData="M25.589,58.665L64.141,58.665C64.897,58.725 65.372,59.262 65.372,59.998C65.372,60.645 64.897,61.365 64.141,61.331L25.589,61.331C24.596,61.365 24.122,60.734 24.122,59.998C24.122,59.262 24.596,58.725 25.589,58.665" + android:pathData="M25.589,58.641L64.141,58.641C64.897,58.701 65.372,59.233 65.372,59.963C65.372,60.604 64.897,61.317 64.141,61.284L25.589,61.284C24.596,61.317 24.122,60.692 24.122,59.963C24.122,59.233 24.596,58.701 25.589,58.641" android:strokeWidth="1" android:fillColor="#B8C8D9" android:fillType="nonZero" android:strokeColor="#00000000"/> <path - android:pathData="M25.589,44.264L64.141,44.264C64.897,44.324 65.372,44.861 65.372,45.597C65.372,46.243 64.897,46.964 64.141,46.929L25.589,46.929C24.596,46.964 24.122,46.332 24.122,45.597C24.122,44.861 24.596,44.324 25.589,44.264" + android:pathData="M25.589,44.367L64.141,44.367C64.897,44.427 65.372,44.959 65.372,45.689C65.372,46.329 64.897,47.044 64.141,47.009L25.589,47.009C24.596,47.044 24.122,46.417 24.122,45.689C24.122,44.959 24.596,44.427 25.589,44.367" android:strokeWidth="1" android:fillColor="#B8C8D9" android:fillType="nonZero" android:strokeColor="#00000000"/> <path - android:pathData="M25.589,72.827L64.141,72.827C64.897,72.887 65.372,73.424 65.372,74.16C65.372,74.806 64.897,75.527 64.141,75.492L25.589,75.492C24.596,75.527 24.122,74.895 24.122,74.16C24.122,73.424 24.596,72.887 25.589,72.827" + android:pathData="M25.589,72.678L64.141,72.678C64.897,72.738 65.372,73.27 65.372,73.999C65.372,74.64 64.897,75.354 64.141,75.32L25.589,75.32C24.596,75.354 24.122,74.728 24.122,73.999C24.122,73.27 24.596,72.738 25.589,72.678" android:strokeWidth="1" android:fillColor="#B8C8D9" android:fillType="nonZero" android:strokeColor="#00000000"/> <path - android:pathData="M35.766,90.803C35.647,90.795 35.532,90.847 35.459,90.942L31.571,95.784L29.594,93.655C29.511,93.546 29.374,93.495 29.241,93.523C29.109,93.549 29.002,93.649 28.966,93.781C28.93,93.913 28.97,94.054 29.071,94.147L31.331,96.585C31.402,96.66 31.502,96.701 31.605,96.697C31.709,96.693 31.804,96.643 31.869,96.562L36.02,91.401C36.109,91.295 36.129,91.149 36.075,91.022C36.022,90.896 35.902,90.811 35.766,90.803" + android:pathData="M35.766,90.495C35.647,90.487 35.532,90.538 35.459,90.632L31.571,95.431L29.594,93.321C29.511,93.213 29.374,93.163 29.241,93.19C29.109,93.216 29.002,93.315 28.966,93.446C28.93,93.577 28.97,93.717 29.071,93.809L31.331,96.225C31.402,96.3 31.502,96.34 31.605,96.336C31.709,96.332 31.804,96.283 31.869,96.203L36.02,91.087C36.109,90.982 36.129,90.837 36.075,90.712C36.022,90.587 35.902,90.502 35.766,90.495" android:strokeWidth="1" android:fillColor="#FFFFFF" android:fillType="nonZero" android:strokeColor="#00000000"/> <path - android:pathData="M35.794,90.304L35.679,90.304C35.441,90.322 35.218,90.441 35.069,90.634L31.544,95.024L29.954,93.312C29.787,93.089 29.458,92.966 29.14,93.033C28.831,93.094 28.577,93.332 28.49,93.646C28.416,93.923 28.479,94.213 28.656,94.429L30.971,96.927C31.144,97.109 31.38,97.206 31.624,97.196C31.87,97.187 32.1,97.069 32.254,96.874L36.403,91.716C36.607,91.473 36.657,91.124 36.528,90.823C36.418,90.561 36.186,90.374 35.914,90.319L35.794,90.304Z" + android:pathData="M35.794,90L35.679,90.001C35.441,90.018 35.218,90.136 35.069,90.328L31.544,94.678L29.954,92.982C29.787,92.76 29.458,92.639 29.14,92.705C28.831,92.765 28.577,93.001 28.49,93.312C28.416,93.587 28.479,93.875 28.656,94.089L30.971,96.565C31.144,96.745 31.38,96.841 31.624,96.832C31.87,96.822 32.1,96.705 32.254,96.513L36.403,91.4C36.607,91.159 36.657,90.814 36.528,90.515C36.418,90.256 36.186,90.07 35.914,90.015L35.794,90Z" android:strokeWidth="1" android:fillColor="#17191A" android:fillType="nonZero" android:strokeColor="#00000000"/> <path - android:pathData="M27.74,23.929C24.747,29.695 17.704,31.911 12.01,28.88C6.315,25.85 4.126,18.719 7.119,12.953C10.113,7.188 17.156,4.971 22.85,8.001C28.544,11.033 30.734,18.163 27.74,23.929" + android:pathData="M27.74,24.212C24.747,29.927 17.704,32.124 12.01,29.12C6.315,26.116 4.126,19.049 7.119,13.334C10.113,7.62 17.156,5.422 22.85,8.425C28.544,11.431 30.734,18.497 27.74,24.212" android:strokeWidth="1" android:fillColor="#FF919A" android:fillType="nonZero" android:strokeColor="#00000000"/> <path - android:pathData="M29.553,29.037C29.285,29.452 28.375,30.91 27.723,29.129C26.873,26.804 25.07,27.311 25.07,27.311L23.401,27.55L26.909,23.54C26.909,23.54 26.824,25.148 27.343,25.952C27.604,26.357 28.149,26.95 28.834,26.966C29.521,26.982 30.848,27.033 29.553,29.037" + android:pathData="M29.553,29.276C29.285,29.687 28.375,31.132 27.723,29.367C26.873,27.062 25.07,27.565 25.07,27.565L23.401,27.802L26.909,23.827C26.909,23.827 26.824,25.421 27.343,26.218C27.604,26.619 28.149,27.207 28.834,27.223C29.521,27.239 30.848,27.289 29.553,29.276" android:strokeWidth="1" android:fillColor="#FF919A" android:fillType="nonZero" android:strokeColor="#00000000"/> <path - android:pathData="M10.424,33.932C9.965,33.759 8.36,33.183 9.93,32.146C11.983,30.792 11.372,28.563 11.372,28.563L10.774,26.966L15.412,29.542C15.412,29.542 13.844,29.816 13.185,30.504C12.852,30.853 12.124,32.083 12.26,32.764C12.397,33.445 12.642,34.768 10.424,33.932" + android:pathData="M10.424,34.128C9.965,33.956 8.36,33.385 9.93,32.358C11.983,31.015 11.372,28.805 11.372,28.805L10.774,27.223L15.412,29.777C15.412,29.777 13.844,30.047 13.185,30.73C12.852,31.075 12.124,32.295 12.26,32.97C12.397,33.645 12.642,34.955 10.424,34.128" android:strokeWidth="1" android:fillColor="#FF919A" android:fillType="nonZero" android:strokeColor="#00000000"/> <path - android:pathData="M22.251,27.966C22.251,27.966 21.317,28.457 21.609,30.583C21.781,31.852 22.631,33.797 22.751,34.2C22.829,34.461 22.985,34.537 23.204,34.695C23.743,35.083 24.56,35.917 22.622,36.467C20.997,36.928 20.26,36.773 20.588,35.794C20.755,35.294 20.834,34.923 20.778,34.399C20.654,33.246 19.849,30.45 18.779,29.695C17.168,28.559 17.71,28.907 17.71,28.907L21.167,26.264L22.251,27.966Z" + android:pathData="M22.251,28.214C22.251,28.214 21.317,28.7 21.609,30.808C21.781,32.065 22.631,33.993 22.751,34.393C22.829,34.651 22.985,34.727 23.204,34.883C23.743,35.268 24.56,36.094 22.622,36.64C20.997,37.096 20.26,36.943 20.588,35.973C20.755,35.477 20.834,35.109 20.778,34.59C20.654,33.447 19.849,30.676 18.779,29.927C17.168,28.802 17.71,29.146 17.71,29.146L21.167,26.527L22.251,28.214Z" android:strokeWidth="1" android:fillColor="#FF919A" android:fillType="nonZero" android:strokeColor="#00000000"/> <path - android:pathData="M14.031,3.144C14.666,3.053 15.373,2.835 15.07,3.95C14.965,4.337 14.946,4.712 14.978,5.057C15.061,5.957 15.36,6.451 16.053,7.021L16.586,7.459L13.034,7.78C13.034,7.78 13.666,7.224 13.493,6.301C13.421,5.916 13.363,5.064 12.934,4.747C12.541,4.455 11.723,3.477 14.031,3.144" + android:pathData="M14.031,3.612C14.666,3.522 15.373,3.306 15.07,4.411C14.965,4.795 14.946,5.166 14.978,5.508C15.061,6.4 15.36,6.89 16.053,7.455L16.586,7.889L13.034,8.207C13.034,8.207 13.666,7.656 13.493,6.741C13.421,6.36 13.363,5.515 12.934,5.201C12.541,4.912 11.723,3.942 14.031,3.612" android:strokeWidth="1" android:fillColor="#FF919A" android:fillType="nonZero" android:strokeColor="#00000000"/> <path - android:pathData="M8.455,14.267C8.175,14.068 8.035,13.72 8.103,13.38C8.222,12.788 8.473,11.882 7.314,10.835C5.988,9.637 4.084,8.722 3.926,8.706C2.717,8.569 1.942,8.517 3.269,6.622C4.526,4.829 5.258,4.901 5.379,6.29C5.406,6.591 5.513,6.878 5.69,7.122C6.318,7.992 8.704,10.351 10.322,10.38C10.817,10.391 10.261,12.97 10.261,12.97C10.167,13.623 8.455,14.267 8.455,14.267" + android:pathData="M8.455,14.637C8.175,14.439 8.035,14.095 8.103,13.758C8.222,13.171 8.473,12.272 7.314,11.234C5.988,10.047 4.084,9.141 3.926,9.124C2.717,8.989 1.942,8.938 3.269,7.058C4.526,5.281 5.258,5.353 5.379,6.729C5.406,7.028 5.513,7.312 5.69,7.554C6.318,8.416 8.704,10.754 10.322,10.784C10.817,10.794 10.261,13.35 10.261,13.35C10.167,13.998 8.455,14.637 8.455,14.637" android:strokeWidth="1" android:fillColor="#FF919A" android:fillType="nonZero" android:strokeColor="#00000000"/> <path - android:pathData="M0.512,17.334C0.67,15.863 1.28,15.158 2.575,16.069C4.814,17.646 7.366,15.337 7.366,15.337L7.855,13.98L7.334,20.36C7.334,20.36 6.333,19.005 5.318,18.517C4.825,18.279 3.311,18.065 2.575,18.37C1.779,18.699 0.314,19.169 0.512,17.334" + android:pathData="M0.512,17.676C0.67,16.218 1.28,15.519 2.575,16.422C4.814,17.985 7.366,15.697 7.366,15.697L7.855,14.352L7.334,20.675C7.334,20.675 6.333,19.332 5.318,18.849C4.825,18.613 3.311,18.401 2.575,18.703C1.779,19.029 0.314,19.495 0.512,17.676" android:strokeWidth="1" android:fillColor="#FF919A" android:fillType="nonZero" android:strokeColor="#00000000"/> <path - android:pathData="M10.348,25.772C10.348,25.772 8.92,24.337 6.972,25.835C5.023,27.334 4.64,27.751 4.64,27.751C4.64,27.751 3.049,31.021 1.379,28.429C-0.292,25.836 1.082,25.222 2.908,25.652C2.908,25.652 6.692,24.576 7.322,22.501C7.953,20.426 7.615,20.958 7.615,20.958L12.02,24.443L10.348,25.772Z" + android:pathData="M10.348,26.04C10.348,26.04 8.92,24.618 6.972,26.102C5.023,27.588 4.64,28.001 4.64,28.001C4.64,28.001 3.049,31.242 1.379,28.673C-0.292,26.103 1.082,25.495 2.908,25.921C2.908,25.921 6.692,24.854 7.322,22.798C7.953,20.741 7.615,21.269 7.615,21.269L12.02,24.723L10.348,26.04Z" android:strokeWidth="1" android:fillColor="#FF919A" android:fillType="nonZero" android:strokeColor="#00000000"/> <path - android:pathData="M31.637,10.099C31.912,10.51 32.888,11.922 31.014,11.842C28.566,11.74 27.784,13.911 27.784,13.911L27.356,15.564L25.059,10.738C25.059,10.738 26.491,11.439 27.424,11.266C27.893,11.179 29.193,10.604 29.473,9.97C29.753,9.335 30.312,8.116 31.637,10.099" + android:pathData="M31.637,10.505C31.912,10.912 32.888,12.313 31.014,12.233C28.566,12.131 27.784,14.284 27.784,14.284L27.356,15.921L25.059,11.139C25.059,11.139 26.491,11.833 27.424,11.661C27.893,11.575 29.193,11.005 29.473,10.377C29.753,9.748 30.312,8.539 31.637,10.505" android:strokeWidth="1" android:fillColor="#FF919A" android:fillType="nonZero" android:strokeColor="#00000000"/> <path - android:pathData="M28.247,17.17C28.247,17.17 28.489,18.941 30.734,18.903C31.998,18.882 32.751,18.904 33.166,18.928C33.434,18.943 34.431,18.937 34.652,18.782C35.198,18.402 36.252,17.913 36.097,19.944C35.966,21.648 35.569,22.295 34.773,21.648C34.367,21.316 33.178,21 32.673,20.873C31.56,20.595 29.727,20.308 28.66,21.066C27.053,22.208 27.561,21.812 27.561,21.812L26.296,17.616L28.247,17.17Z" + android:pathData="M28.247,17.513C28.247,17.513 28.489,19.269 30.734,19.231C31.998,19.21 32.751,19.232 33.166,19.256C33.434,19.271 34.431,19.265 34.652,19.111C35.198,18.735 36.252,18.25 36.097,20.263C35.966,21.952 35.569,22.593 34.773,21.952C34.367,21.623 33.178,21.31 32.673,21.184C31.56,20.908 29.727,20.624 28.66,21.375C27.053,22.507 27.561,22.114 27.561,22.114L26.296,17.955L28.247,17.513Z" android:strokeWidth="1" android:fillColor="#FF919A" android:fillType="nonZero" android:strokeColor="#00000000"/> <path - android:pathData="M18.886,7.498C18.886,7.498 20.756,8.011 21.682,5.725C22.124,4.632 22.473,3.376 22.623,2.945C22.737,2.617 22.783,2.27 22.756,1.924C22.707,1.299 22.871,0.264 24.791,1.28C27.018,2.46 26.315,3.024 25.575,3.323C25.276,3.444 25.012,3.641 24.797,3.885C24.055,4.725 22.477,7.21 22.818,8.81C23.268,10.923 23.301,10.293 23.301,10.293L18.572,9.781L18.886,7.498Z" + android:pathData="M18.886,7.927C18.886,7.927 20.756,8.436 21.682,6.17C22.124,5.087 22.473,3.842 22.623,3.415C22.737,3.089 22.783,2.745 22.756,2.403C22.707,1.783 22.871,0.757 24.791,1.764C27.018,2.934 26.315,3.493 25.575,3.789C25.276,3.909 25.012,4.104 24.797,4.346C24.055,5.179 22.477,7.642 22.818,9.228C23.268,11.322 23.301,10.697 23.301,10.697L18.572,10.19L18.886,7.927Z" android:strokeWidth="1" android:fillColor="#FF919A" android:fillType="nonZero" diff --git a/Corona-Warn-App/src/main/res/drawable-night/ic_test_result_illustration_positive_card.xml b/Corona-Warn-App/src/main/res/drawable-night/ic_test_result_illustration_positive_card.xml new file mode 100644 index 0000000000000000000000000000000000000000..5a17e9c7ab288a4505365060afb47de549fc15e9 --- /dev/null +++ b/Corona-Warn-App/src/main/res/drawable-night/ic_test_result_illustration_positive_card.xml @@ -0,0 +1,128 @@ +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="80dp" + android:height="112dp" + android:viewportWidth="80" + android:viewportHeight="112"> + <group> + <path + android:pathData="M8.615,17.767l0,93.738l70.324,0l0,-75.88l-16.886,-17.858z" + android:strokeWidth="1" + android:fillColor="#3F3F43" + android:fillType="nonZero" + android:strokeColor="#00000000"/> + <path + android:pathData="M62.097,35.624l16.786,0l-16.786,-17.844z" + android:strokeWidth="1" + android:fillColor="#B8C8D9" + android:fillType="nonZero" + android:strokeColor="#00000000"/> + <path + android:pathData="M35.826,98.669L29.418,98.669C28.326,98.669 27.441,97.781 27.441,96.684L27.441,90.254C27.441,89.157 28.326,88.27 29.418,88.27L35.826,88.27C36.919,88.27 37.803,89.157 37.803,90.254L37.803,96.684C37.803,97.781 36.919,98.669 35.826,98.669" + android:strokeWidth="1" + android:fillColor="#FF919A" + android:fillType="nonZero" + android:strokeColor="#00000000"/> + <path + android:pathData="M60.851,98.669L54.44,98.669C53.349,98.669 52.464,97.781 52.464,96.685L52.464,90.252C52.464,89.157 53.349,88.27 54.44,88.27L60.851,88.27C61.942,88.27 62.827,89.157 62.827,90.252L62.827,96.685C62.827,97.781 61.942,98.669 60.851,98.669" + android:strokeWidth="1" + android:fillColor="#B8C8D9" + android:fillType="nonZero" + android:strokeColor="#00000000"/> + <path + android:pathData="M25.589,58.641L64.141,58.641C64.897,58.701 65.372,59.233 65.372,59.963C65.372,60.604 64.897,61.317 64.141,61.284L25.589,61.284C24.596,61.317 24.122,60.692 24.122,59.963C24.122,59.233 24.596,58.701 25.589,58.641" + android:strokeWidth="1" + android:fillColor="#B8C8D9" + android:fillType="nonZero" + android:strokeColor="#00000000"/> + <path + android:pathData="M25.589,44.367L64.141,44.367C64.897,44.427 65.372,44.959 65.372,45.689C65.372,46.329 64.897,47.044 64.141,47.009L25.589,47.009C24.596,47.044 24.122,46.417 24.122,45.689C24.122,44.959 24.596,44.427 25.589,44.367" + android:strokeWidth="1" + android:fillColor="#B8C8D9" + android:fillType="nonZero" + android:strokeColor="#00000000"/> + <path + android:pathData="M25.589,72.678L64.141,72.678C64.897,72.738 65.372,73.27 65.372,73.999C65.372,74.64 64.897,75.354 64.141,75.32L25.589,75.32C24.596,75.354 24.122,74.728 24.122,73.999C24.122,73.27 24.596,72.738 25.589,72.678" + android:strokeWidth="1" + android:fillColor="#B8C8D9" + android:fillType="nonZero" + android:strokeColor="#00000000"/> + <path + android:pathData="M35.766,90.495C35.647,90.487 35.532,90.538 35.459,90.632L31.571,95.431L29.594,93.321C29.511,93.213 29.374,93.163 29.241,93.19C29.109,93.216 29.002,93.315 28.966,93.446C28.93,93.577 28.97,93.717 29.071,93.809L31.331,96.225C31.402,96.3 31.502,96.34 31.605,96.336C31.709,96.332 31.804,96.283 31.869,96.203L36.02,91.087C36.109,90.982 36.129,90.837 36.075,90.712C36.022,90.587 35.902,90.502 35.766,90.495" + android:strokeWidth="1" + android:fillColor="#FFFFFF" + android:fillType="nonZero" + android:strokeColor="#00000000"/> + <path + android:pathData="M35.794,90L35.679,90.001C35.441,90.018 35.218,90.136 35.069,90.328L31.544,94.678L29.954,92.982C29.787,92.76 29.458,92.639 29.14,92.705C28.831,92.765 28.577,93.001 28.49,93.312C28.416,93.587 28.479,93.875 28.656,94.089L30.971,96.565C31.144,96.745 31.38,96.841 31.624,96.832C31.87,96.822 32.1,96.705 32.254,96.513L36.403,91.4C36.607,91.159 36.657,90.814 36.528,90.515C36.418,90.256 36.186,90.07 35.914,90.015L35.794,90Z" + android:strokeWidth="1" + android:fillColor="#17191A" + android:fillType="nonZero" + android:strokeColor="#00000000"/> + <path + android:pathData="M27.74,24.212C24.747,29.927 17.704,32.124 12.01,29.12C6.315,26.116 4.126,19.049 7.119,13.334C10.113,7.62 17.156,5.422 22.85,8.425C28.544,11.431 30.734,18.497 27.74,24.212" + android:strokeWidth="1" + android:fillColor="#FF919A" + android:fillType="nonZero" + android:strokeColor="#00000000"/> + <path + android:pathData="M29.553,29.276C29.285,29.687 28.375,31.132 27.723,29.367C26.873,27.062 25.07,27.565 25.07,27.565L23.401,27.802L26.909,23.827C26.909,23.827 26.824,25.421 27.343,26.218C27.604,26.619 28.149,27.207 28.834,27.223C29.521,27.239 30.848,27.289 29.553,29.276" + android:strokeWidth="1" + android:fillColor="#FF919A" + android:fillType="nonZero" + android:strokeColor="#00000000"/> + <path + android:pathData="M10.424,34.128C9.965,33.956 8.36,33.385 9.93,32.358C11.983,31.015 11.372,28.805 11.372,28.805L10.774,27.223L15.412,29.777C15.412,29.777 13.844,30.047 13.185,30.73C12.852,31.075 12.124,32.295 12.26,32.97C12.397,33.645 12.642,34.955 10.424,34.128" + android:strokeWidth="1" + android:fillColor="#FF919A" + android:fillType="nonZero" + android:strokeColor="#00000000"/> + <path + android:pathData="M22.251,28.214C22.251,28.214 21.317,28.7 21.609,30.808C21.781,32.065 22.631,33.993 22.751,34.393C22.829,34.651 22.985,34.727 23.204,34.883C23.743,35.268 24.56,36.094 22.622,36.64C20.997,37.096 20.26,36.943 20.588,35.973C20.755,35.477 20.834,35.109 20.778,34.59C20.654,33.447 19.849,30.676 18.779,29.927C17.168,28.802 17.71,29.146 17.71,29.146L21.167,26.527L22.251,28.214Z" + android:strokeWidth="1" + android:fillColor="#FF919A" + android:fillType="nonZero" + android:strokeColor="#00000000"/> + <path + android:pathData="M14.031,3.612C14.666,3.522 15.373,3.306 15.07,4.411C14.965,4.795 14.946,5.166 14.978,5.508C15.061,6.4 15.36,6.89 16.053,7.455L16.586,7.889L13.034,8.207C13.034,8.207 13.666,7.656 13.493,6.741C13.421,6.36 13.363,5.515 12.934,5.201C12.541,4.912 11.723,3.942 14.031,3.612" + android:strokeWidth="1" + android:fillColor="#FF919A" + android:fillType="nonZero" + android:strokeColor="#00000000"/> + <path + android:pathData="M8.455,14.637C8.175,14.439 8.035,14.095 8.103,13.758C8.222,13.171 8.473,12.272 7.314,11.234C5.988,10.047 4.084,9.141 3.926,9.124C2.717,8.989 1.942,8.938 3.269,7.058C4.526,5.281 5.258,5.353 5.379,6.729C5.406,7.028 5.513,7.312 5.69,7.554C6.318,8.416 8.704,10.754 10.322,10.784C10.817,10.794 10.261,13.35 10.261,13.35C10.167,13.998 8.455,14.637 8.455,14.637" + android:strokeWidth="1" + android:fillColor="#FF919A" + android:fillType="nonZero" + android:strokeColor="#00000000"/> + <path + android:pathData="M0.512,17.676C0.67,16.218 1.28,15.519 2.575,16.422C4.814,17.985 7.366,15.697 7.366,15.697L7.855,14.352L7.334,20.675C7.334,20.675 6.333,19.332 5.318,18.849C4.825,18.613 3.311,18.401 2.575,18.703C1.779,19.029 0.314,19.495 0.512,17.676" + android:strokeWidth="1" + android:fillColor="#FF919A" + android:fillType="nonZero" + android:strokeColor="#00000000"/> + <path + android:pathData="M10.348,26.04C10.348,26.04 8.92,24.618 6.972,26.102C5.023,27.588 4.64,28.001 4.64,28.001C4.64,28.001 3.049,31.242 1.379,28.673C-0.292,26.103 1.082,25.495 2.908,25.921C2.908,25.921 6.692,24.854 7.322,22.798C7.953,20.741 7.615,21.269 7.615,21.269L12.02,24.723L10.348,26.04Z" + android:strokeWidth="1" + android:fillColor="#FF919A" + android:fillType="nonZero" + android:strokeColor="#00000000"/> + <path + android:pathData="M31.637,10.505C31.912,10.912 32.888,12.313 31.014,12.233C28.566,12.131 27.784,14.284 27.784,14.284L27.356,15.921L25.059,11.139C25.059,11.139 26.491,11.833 27.424,11.661C27.893,11.575 29.193,11.005 29.473,10.377C29.753,9.748 30.312,8.539 31.637,10.505" + android:strokeWidth="1" + android:fillColor="#FF919A" + android:fillType="nonZero" + android:strokeColor="#00000000"/> + <path + android:pathData="M28.247,17.513C28.247,17.513 28.489,19.269 30.734,19.231C31.998,19.21 32.751,19.232 33.166,19.256C33.434,19.271 34.431,19.265 34.652,19.111C35.198,18.735 36.252,18.25 36.097,20.263C35.966,21.952 35.569,22.593 34.773,21.952C34.367,21.623 33.178,21.31 32.673,21.184C31.56,20.908 29.727,20.624 28.66,21.375C27.053,22.507 27.561,22.114 27.561,22.114L26.296,17.955L28.247,17.513Z" + android:strokeWidth="1" + android:fillColor="#FF919A" + android:fillType="nonZero" + android:strokeColor="#00000000"/> + <path + android:pathData="M18.886,7.927C18.886,7.927 20.756,8.436 21.682,6.17C22.124,5.087 22.473,3.842 22.623,3.415C22.737,3.089 22.783,2.745 22.756,2.403C22.707,1.783 22.871,0.757 24.791,1.764C27.018,2.934 26.315,3.493 25.575,3.789C25.276,3.909 25.012,4.104 24.797,4.346C24.055,5.179 22.477,7.642 22.818,9.228C23.268,11.322 23.301,10.697 23.301,10.697L18.572,10.19L18.886,7.927Z" + android:strokeWidth="1" + android:fillColor="#FF919A" + android:fillType="nonZero" + android:strokeColor="#00000000"/> + </group> +</vector> diff --git a/Corona-Warn-App/src/main/res/drawable/ic_link.xml b/Corona-Warn-App/src/main/res/drawable/ic_link.xml new file mode 100644 index 0000000000000000000000000000000000000000..d49fc9674ec9a2d0b634efa7959e085543c7bb1e --- /dev/null +++ b/Corona-Warn-App/src/main/res/drawable/ic_link.xml @@ -0,0 +1,13 @@ +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="18dp" + android:height="18dp" + android:viewportWidth="18" + android:viewportHeight="18"> + <path + android:pathData="M2,0C0.9069,0 0,0.9069 0,2L0,16C0,17.0931 0.9069,18 2,18L16,18C17.0931,18 18,17.0931 18,16L18,9L16,9L16,16L2,16L2,2L9,2L9,0L2,0ZM11,0L11,2L14.5859,2L5.293,11.293L6.707,12.707L16,3.4141L16,7L18,7L18,0L11,0Z" + android:strokeWidth="1" + android:fillColor="#17191A" + android:fillAlpha="1" + android:fillType="evenOdd" + android:strokeColor="#00000000"/> +</vector> diff --git a/Corona-Warn-App/src/main/res/layout/fragment_information.xml b/Corona-Warn-App/src/main/res/layout/fragment_information.xml index edef7239dd82bf11429e50628af9cdf1fdf4ff45..d51c313a9172fd2dba61cbbcdfa0a807b3e55a57 100644 --- a/Corona-Warn-App/src/main/res/layout/fragment_information.xml +++ b/Corona-Warn-App/src/main/res/layout/fragment_information.xml @@ -54,6 +54,7 @@ layout="@layout/include_row" android:layout_width="0dp" android:layout_height="wrap_content" + app:icon="@{@drawable/ic_link}" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/information_about" @@ -115,6 +116,7 @@ android:layout_width="@dimen/match_constraint" android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_small" + android:focusable="true" android:text="@{FormatterInformationHelper.formatVersion()}" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="@+id/guideline_body" diff --git a/Corona-Warn-App/src/main/res/layout/fragment_information_about.xml b/Corona-Warn-App/src/main/res/layout/fragment_information_about.xml index d07c91a08f0d0ef5969d087e1f16fc1630663279..b2f48c1a246f3d223aa4061ab8c3670edd9a12c5 100644 --- a/Corona-Warn-App/src/main/res/layout/fragment_information_about.xml +++ b/Corona-Warn-App/src/main/res/layout/fragment_information_about.xml @@ -3,8 +3,11 @@ xmlns:app="http://schemas.android.com/apk/res-auto"> <androidx.constraintlayout.widget.ConstraintLayout + android:id="@+id/information_about_container" android:layout_width="match_parent" - android:layout_height="match_parent"> + android:layout_height="match_parent" + android:contentDescription="@string/information_about_title" + android:focusable="true"> <include android:id="@+id/information_about_header" @@ -18,10 +21,8 @@ app:title="@{@string/information_about_title}" /> <ScrollView - android:id="@+id/information_about_scrollview" android:layout_width="0dp" android:layout_height="0dp" - android:contentDescription="@string/information_about_title" android:fillViewport="true" app:layout_constraintBottom_toBottomOf="@+id/guideline_bottom" app:layout_constraintEnd_toEndOf="parent" @@ -30,8 +31,7 @@ <androidx.constraintlayout.widget.ConstraintLayout android:layout_width="match_parent" - android:layout_height="wrap_content" - android:focusable="true"> + android:layout_height="wrap_content"> <include android:id="@+id/information_about_header_details" @@ -52,6 +52,7 @@ android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_medium" android:text="@string/information_about_body_emphasized" + android:focusable="true" app:layout_constraintEnd_toStartOf="@+id/guideline_end" app:layout_constraintStart_toEndOf="@+id/guideline_start" app:layout_constraintTop_toBottomOf="@+id/information_about_header_details" /> @@ -63,6 +64,7 @@ android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_small" android:text="@string/information_about_body" + android:focusable="true" app:layout_constraintEnd_toStartOf="@+id/guideline_end" app:layout_constraintStart_toEndOf="@+id/guideline_start" app:layout_constraintTop_toBottomOf="@+id/information_about_body_emphasized" /> diff --git a/Corona-Warn-App/src/main/res/layout/fragment_information_contact.xml b/Corona-Warn-App/src/main/res/layout/fragment_information_contact.xml index 8d8dafb4e0f4603c471b7ed5dd5f23a206fe6388..02826cb2bb1e01bcf60766b4e436f1fb7522ed64 100644 --- a/Corona-Warn-App/src/main/res/layout/fragment_information_contact.xml +++ b/Corona-Warn-App/src/main/res/layout/fragment_information_contact.xml @@ -6,6 +6,7 @@ android:id="@+id/information_contact_container" android:layout_width="match_parent" android:layout_height="match_parent" + android:focusable="true" android:contentDescription="@string/information_contact_title"> <include @@ -30,8 +31,7 @@ <androidx.constraintlayout.widget.ConstraintLayout android:layout_width="match_parent" - android:layout_height="wrap_content" - android:focusable="true"> + android:layout_height="wrap_content"> <include android:id="@+id/information_contact_header_details" @@ -59,10 +59,12 @@ <TextView android:id="@+id/information_contact_subtitle_phone" style="@style/headline6" + android:accessibilityHeading="true" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_small" android:text="@string/information_contact_subtitle_phone" + android:focusable="true" app:layout_constraintEnd_toStartOf="@+id/guideline_end" app:layout_constraintStart_toEndOf="@+id/guideline_start" app:layout_constraintTop_toBottomOf="@+id/divider" /> @@ -83,6 +85,7 @@ android:layout_width="0dp" android:layout_height="wrap_content" android:text="@string/information_contact_body_phone" + android:focusable="true" app:layout_constraintEnd_toEndOf="@+id/guideline_end" app:layout_constraintStart_toStartOf="@+id/guideline_start" app:layout_constraintTop_toBottomOf="@+id/information_contact_navigation_row_phone" /> @@ -94,6 +97,7 @@ android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_normal" android:text="@string/information_contact_body_open" + android:focusable="true" app:layout_constraintEnd_toEndOf="@+id/guideline_end" app:layout_constraintStart_toStartOf="@+id/guideline_start" app:layout_constraintTop_toBottomOf="@+id/information_contact_body_phone" /> @@ -105,6 +109,7 @@ android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_normal" android:text="@string/information_contact_body_other" + android:focusable="true" app:layout_constraintEnd_toEndOf="@+id/guideline_end" app:layout_constraintStart_toStartOf="@+id/guideline_start" app:layout_constraintTop_toBottomOf="@+id/information_contact_body_open" /> diff --git a/Corona-Warn-App/src/main/res/layout/fragment_information_legal.xml b/Corona-Warn-App/src/main/res/layout/fragment_information_legal.xml index b85d76155a137c606b58ba694070fef5508b0594..6827fea70c2affbae376b0db88eebaac2a6c5de4 100644 --- a/Corona-Warn-App/src/main/res/layout/fragment_information_legal.xml +++ b/Corona-Warn-App/src/main/res/layout/fragment_information_legal.xml @@ -14,6 +14,7 @@ android:id="@+id/information_legal_container" android:layout_width="match_parent" android:layout_height="match_parent" + android:focusable="true" android:contentDescription="@string/information_legal_title"> <include @@ -61,6 +62,7 @@ android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_tiny" android:text="@string/information_legal_body_publisher" + android:focusable="true" app:layout_constraintEnd_toStartOf="@+id/guideline_end" app:layout_constraintStart_toEndOf="@+id/guideline_start" app:layout_constraintTop_toBottomOf="@+id/information_legal_header_details" /> @@ -71,6 +73,7 @@ android:layout_width="@dimen/match_constraint" android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_medium" + android:focusable="true" app:layout_constraintEnd_toEndOf="@+id/guideline_end" app:layout_constraintStart_toStartOf="@+id/guideline_start" app:layout_constraintTop_toBottomOf="@+id/information_legal_body_publisher" /> @@ -78,10 +81,12 @@ <TextView android:id="@+id/information_legal_headline_contact" style="@style/headline5" + android:accessibilityHeading="true" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_small" android:text="@string/information_legal_headline_contact" + android:focusable="true" app:layout_constraintEnd_toStartOf="@+id/guideline_end" app:layout_constraintStart_toEndOf="@+id/guideline_start" app:layout_constraintTop_toBottomOf="@+id/information_legal_divider_contact" /> @@ -93,6 +98,7 @@ android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_tiny" android:text="@string/information_legal_subtitle_contact" + android:focusable="true" app:layout_constraintEnd_toStartOf="@+id/guideline_end" app:layout_constraintStart_toEndOf="@+id/guideline_start" app:layout_constraintTop_toBottomOf="@+id/information_legal_headline_contact" /> @@ -110,10 +116,12 @@ <TextView android:id="@+id/information_legal_headline_taxid" style="@style/headline5" + android:accessibilityHeading="true" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_small" android:text="@string/information_legal_headline_taxid" + android:focusable="true" app:layout_constraintEnd_toStartOf="@+id/guideline_end" app:layout_constraintStart_toEndOf="@+id/guideline_start" app:layout_constraintTop_toBottomOf="@+id/information_legal_divider_taxid" /> @@ -125,6 +133,7 @@ android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_tiny" android:text="@string/information_legal_subtitle_taxid" + android:focusable="true" app:layout_constraintEnd_toStartOf="@+id/guideline_end" app:layout_constraintStart_toEndOf="@+id/guideline_start" app:layout_constraintTop_toBottomOf="@+id/information_legal_headline_taxid" /> diff --git a/Corona-Warn-App/src/main/res/layout/fragment_information_privacy.xml b/Corona-Warn-App/src/main/res/layout/fragment_information_privacy.xml index 05da54a758869f08b5e0d95a6758993d2b46f858..655046eaf8006bb7daf07df7b41b891e68bdd30a 100644 --- a/Corona-Warn-App/src/main/res/layout/fragment_information_privacy.xml +++ b/Corona-Warn-App/src/main/res/layout/fragment_information_privacy.xml @@ -14,6 +14,7 @@ android:id="@+id/information_privacy_container" android:layout_width="match_parent" android:layout_height="match_parent" + android:focusable="true" android:contentDescription="@string/information_privacy_title"> <include diff --git a/Corona-Warn-App/src/main/res/layout/fragment_information_technical.xml b/Corona-Warn-App/src/main/res/layout/fragment_information_technical.xml index d9491981764baa72bbd6e03a77f6b5d4ead60d00..fa037a6adff6dd1b0fb2c479f815fa60b26c4117 100644 --- a/Corona-Warn-App/src/main/res/layout/fragment_information_technical.xml +++ b/Corona-Warn-App/src/main/res/layout/fragment_information_technical.xml @@ -14,6 +14,7 @@ android:id="@+id/information_technical_container" android:layout_width="match_parent" android:layout_height="match_parent" + android:focusable="true" android:contentDescription="@string/information_technical_title"> <include @@ -31,7 +32,6 @@ android:layout_width="@dimen/match_constraint" android:layout_height="@dimen/match_constraint" android:fillViewport="true" - android:focusable="true" app:layout_constraintBottom_toBottomOf="@+id/guideline_bottom" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" diff --git a/Corona-Warn-App/src/main/res/layout/fragment_information_terms.xml b/Corona-Warn-App/src/main/res/layout/fragment_information_terms.xml index e4e13e84fb16ad1fb2f5dc72d07c3ebc971c3c82..080c8f6df933158df8c6be5d8c06190612e2a431 100644 --- a/Corona-Warn-App/src/main/res/layout/fragment_information_terms.xml +++ b/Corona-Warn-App/src/main/res/layout/fragment_information_terms.xml @@ -14,6 +14,7 @@ android:id="@+id/information_terms_container" android:layout_width="match_parent" android:layout_height="match_parent" + android:focusable="true" android:contentDescription="@string/information_terms_title"> <include diff --git a/Corona-Warn-App/src/main/res/layout/fragment_main.xml b/Corona-Warn-App/src/main/res/layout/fragment_main.xml index 6a9bd45d4e0208d49f49e6cac454f05170b1cc87..13b7ee05d7b323fa1348215c58193c01f03a71a1 100644 --- a/Corona-Warn-App/src/main/res/layout/fragment_main.xml +++ b/Corona-Warn-App/src/main/res/layout/fragment_main.xml @@ -9,6 +9,8 @@ <import type="de.rki.coronawarnapp.util.formatter.FormatterSubmissionHelper" /> + <import type="de.rki.coronawarnapp.util.formatter.FormatterAccessibilityHelper" /> + <variable name="submissionViewModel" type="de.rki.coronawarnapp.ui.viewmodel.SubmissionViewModel" /> @@ -48,9 +50,10 @@ android:id="@+id/main_header_logo" android:layout_width="0dp" android:layout_height="match_parent" - android:importantForAccessibility="no" + android:contentDescription="@{FormatterAccessibilityHelper.formatImage(@string/accessibility_logo)}" android:scaleType="fitStart" android:src="@drawable/ic_main_header" + android:focusable="true" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toStartOf="@+id/main_header_share" app:layout_constraintStart_toStartOf="parent" @@ -61,8 +64,9 @@ layout="@layout/include_button_icon" android:layout_width="wrap_content" android:layout_height="wrap_content" + android:focusable="true" app:icon="@{@drawable/ic_main_share}" - app:iconDescription="@{@string/main_share_title}" + app:iconDescription="@{@string/button_share}" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toStartOf="@+id/main_header_options_menu" app:layout_constraintTop_toTopOf="parent" /> @@ -72,8 +76,9 @@ layout="@layout/include_button_icon" android:layout_width="wrap_content" android:layout_height="wrap_content" + android:focusable="true" app:icon="@{@drawable/ic_main_settings}" - app:iconDescription="@{@string/accessibility_menu}" + app:iconDescription="@{@string/button_menu}" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toTopOf="parent" /> @@ -209,10 +214,11 @@ android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_small" - app:layout_constraintBottom_toTopOf="@+id/guideline_bottom" app:layout_constraintEnd_toStartOf="@+id/guideline_card_end" app:layout_constraintStart_toStartOf="@+id/guideline_card_start" - app:layout_constraintTop_toBottomOf="@+id/main_barrier" /> + app:layout_constraintTop_toBottomOf="@+id/main_barrier" + app:layout_constraintBottom_toBottomOf="@+id/guideline_bottom" + app:layout_constraintVertical_bias="0.0"/> <include layout="@layout/merge_guidelines_side" /> diff --git a/Corona-Warn-App/src/main/res/layout/fragment_main_overview.xml b/Corona-Warn-App/src/main/res/layout/fragment_main_overview.xml index 92c15258c0321986f0d9933521a70dff041296ce..8cc2ca342e4f94da7bbdef339effe5e7b0da1774 100644 --- a/Corona-Warn-App/src/main/res/layout/fragment_main_overview.xml +++ b/Corona-Warn-App/src/main/res/layout/fragment_main_overview.xml @@ -66,6 +66,7 @@ app:body="@{@string/main_overview_body_risk}" app:icon="@{@drawable/ic_main_overview_2}" app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintHorizontal_bias="0.0" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/main_overview_tracing" app:subtitle="@{@string/main_overview_subtitle_risk}" /> @@ -80,15 +81,29 @@ app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/main_overview_risk"> - <include - android:id="@+id/main_overview_risk_subtitle_text" - layout="@layout/include_main_overview_glossary" + <androidx.constraintlayout.widget.ConstraintLayout + android:id="@+id/main_overview_risk_headline" + style="@style/row" android:layout_width="0dp" android:layout_height="wrap_content" + android:paddingTop="@dimen/spacing_small" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toTopOf="parent" - app:subtitle="@{@string/main_overview_subtitle_risk_levels}" /> + app:layout_constraintTop_toTopOf="parent"> + + <TextView + style="@style/headline6" + android:layout_width="0dp" + android:layout_height="wrap_content" + android:layout_marginStart="@dimen/guideline_body_title" + android:accessibilityHeading="true" + android:text="@string/main_overview_subtitle_risk_levels" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" /> + + </androidx.constraintlayout.widget.ConstraintLayout> + <include android:id="@+id/main_overview_risk_increased_risk" @@ -99,7 +114,7 @@ app:iconTint="@{@color/colorSemanticHighRisk}" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toBottomOf="@+id/main_overview_risk_subtitle_text" + app:layout_constraintTop_toBottomOf="@+id/main_overview_risk_headline" app:subtitle="@{@string/main_overview_subtitle_increased_risk}" /> <include @@ -162,6 +177,7 @@ android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="@dimen/guideline_body_title" + android:accessibilityHeading="true" android:text="@string/main_overview_headline_glossary" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" diff --git a/Corona-Warn-App/src/main/res/layout/fragment_main_share.xml b/Corona-Warn-App/src/main/res/layout/fragment_main_share.xml index f9b4b42b3d82dbcdd152c9caf107ad884e9ee8cf..e69e6cfafee72896cc6388e6c6fff575d585e75a 100644 --- a/Corona-Warn-App/src/main/res/layout/fragment_main_share.xml +++ b/Corona-Warn-App/src/main/res/layout/fragment_main_share.xml @@ -11,8 +11,10 @@ </data> <androidx.constraintlayout.widget.ConstraintLayout + android:id="@+id/main_share_container" android:layout_width="match_parent" - android:layout_height="match_parent"> + android:layout_height="match_parent" + android:contentDescription="@string/main_share_title"> <include android:id="@+id/main_share_header" diff --git a/Corona-Warn-App/src/main/res/layout/fragment_onboarding_notifications.xml b/Corona-Warn-App/src/main/res/layout/fragment_onboarding_notifications.xml index 1800f51050ee1f7067070a99771136549596cf41..98934eed2f6aa477fb1d0ed4043f9428b21558cb 100644 --- a/Corona-Warn-App/src/main/res/layout/fragment_onboarding_notifications.xml +++ b/Corona-Warn-App/src/main/res/layout/fragment_onboarding_notifications.xml @@ -7,6 +7,7 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:contentDescription="@string/onboarding_notifications_accessibility_title" + android:focusable="true" android:fillViewport="true"> <androidx.constraintlayout.widget.ConstraintLayout diff --git a/Corona-Warn-App/src/main/res/layout/fragment_onboarding_privacy.xml b/Corona-Warn-App/src/main/res/layout/fragment_onboarding_privacy.xml index 739392b9baa54a2fd903a9b0563132818b62ac74..211d7a736c40f5465a675f9a9c564946e8bb577c 100644 --- a/Corona-Warn-App/src/main/res/layout/fragment_onboarding_privacy.xml +++ b/Corona-Warn-App/src/main/res/layout/fragment_onboarding_privacy.xml @@ -15,6 +15,7 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:contentDescription="@string/onboarding_privacy_accessibility_title" + android:focusable="true" android:fillViewport="true"> <androidx.constraintlayout.widget.ConstraintLayout diff --git a/Corona-Warn-App/src/main/res/layout/fragment_onboarding_test.xml b/Corona-Warn-App/src/main/res/layout/fragment_onboarding_test.xml index 8fd19dc34817701fb8c98369ead94a7d7b877639..5a73d2835b999dd33953235dd6e73b65d74cb462 100644 --- a/Corona-Warn-App/src/main/res/layout/fragment_onboarding_test.xml +++ b/Corona-Warn-App/src/main/res/layout/fragment_onboarding_test.xml @@ -7,6 +7,7 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:contentDescription="@string/onboarding_test_accessibility_title" + android:focusable="true" android:fillViewport="true"> <androidx.constraintlayout.widget.ConstraintLayout diff --git a/Corona-Warn-App/src/main/res/layout/fragment_onboarding_tracing.xml b/Corona-Warn-App/src/main/res/layout/fragment_onboarding_tracing.xml index dca4457c3534889560cb34e3e355ccc8d678cf52..c927d4d090d9087e92c539f04b60ca1b276bd575 100644 --- a/Corona-Warn-App/src/main/res/layout/fragment_onboarding_tracing.xml +++ b/Corona-Warn-App/src/main/res/layout/fragment_onboarding_tracing.xml @@ -7,6 +7,7 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:contentDescription="@string/onboarding_tracing_accessibility_title" + android:focusable="true" android:fillViewport="true"> <androidx.constraintlayout.widget.ConstraintLayout diff --git a/Corona-Warn-App/src/main/res/layout/fragment_risk_details.xml b/Corona-Warn-App/src/main/res/layout/fragment_risk_details.xml index 2289e51a0df681254bd27a7615555c06732f5a21..0cfb4d8f442bf43a51251bdda27219865c71ec95 100644 --- a/Corona-Warn-App/src/main/res/layout/fragment_risk_details.xml +++ b/Corona-Warn-App/src/main/res/layout/fragment_risk_details.xml @@ -9,6 +9,8 @@ <import type="de.rki.coronawarnapp.util.formatter.FormatterRiskHelper" /> + <import type="de.rki.coronawarnapp.util.formatter.FormatterAccessibilityHelper" /> + <import type="android.view.View" /> <variable @@ -49,7 +51,7 @@ style="@style/icon" android:layout_width="@dimen/icon_size_button" android:layout_height="@dimen/icon_size_button" - android:contentDescription="@{@string/accessibility_back}" + android:contentDescription="@{FormatterAccessibilityHelper.formatButton(@string/accessibility_back)}" android:src="@{@drawable/ic_close}" android:tint="@{FormatterRiskHelper.formatStableTextColor(tracingViewModel.riskLevel)}" app:layout_constraintBottom_toBottomOf="parent" @@ -61,6 +63,7 @@ <TextView android:id="@+id/risk_details_header_title" style="@style/headline6" + android:accessibilityHeading="true" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="@dimen/guideline_body_title" @@ -99,8 +102,7 @@ <androidx.constraintlayout.widget.ConstraintLayout android:layout_width="match_parent" - android:layout_height="wrap_content" - android:focusable="true"> + android:layout_height="wrap_content"> <include android:id="@+id/risk_details_risk_card" @@ -118,11 +120,12 @@ <TextView android:id="@+id/risk_details_behavior_headline" style="@style/headline5" + android:accessibilityHeading="true" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_medium" - android:focusable="false" android:text="@string/risk_details_headline_behavior" + android:focusable="true" app:layout_constraintEnd_toStartOf="@+id/guideline_end" app:layout_constraintStart_toStartOf="@+id/guideline_start" app:layout_constraintTop_toBottomOf="@+id/risk_details_risk_card" /> @@ -133,7 +136,7 @@ android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_tiny" - android:focusable="false" + android:focusable="true" android:text="@string/risk_details_subtitle_behavior" app:layout_constraintEnd_toStartOf="@+id/guideline_end" app:layout_constraintStart_toStartOf="@+id/guideline_start" @@ -154,7 +157,7 @@ android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_normal" - android:focusable="false" + android:focusable="true" android:visibility="@{FormatterRiskHelper.formatVisibilityBehavior(tracingViewModel.riskLevel)}" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" @@ -167,7 +170,7 @@ android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_normal" - android:focusable="false" + android:focusable="true" android:visibility="@{FormatterRiskHelper.formatVisibilityBehaviorIncreasedRisk(tracingViewModel.riskLevel)}" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" @@ -181,7 +184,6 @@ style="@style/greyBodyBackground" android:layout_width="match_parent" android:layout_height="wrap_content" - android:focusable="true" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@id/risk_details_behavior_wrapper"> @@ -189,10 +191,11 @@ <TextView android:id="@+id/risk_details_information_headline" style="@style/headline5" + android:accessibilityHeading="true" android:layout_width="match_parent" android:layout_height="wrap_content" - android:focusable="false" android:text="@string/risk_details_headline_infection_risk" + android:focusable="true" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> @@ -203,8 +206,8 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_tiny" - android:focusable="false" android:text="@string/risk_details_subtitle_infection_risk" + android:focusable="true" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/risk_details_information_headline" /> @@ -215,9 +218,9 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_normal" - android:focusable="false" android:text="@{FormatterRiskHelper.formatRiskDetailsRiskLevelBody(tracingViewModel.riskLevel, tracingViewModel.daysSinceLastExposure)}" android:visibility="@{FormatterHelper.formatVisibilityText(FormatterRiskHelper.formatRiskDetailsRiskLevelBody(tracingViewModel.riskLevel, tracingViewModel.daysSinceLastExposure))}" + android:focusable="true" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/risk_details_information_subtitle" /> @@ -228,8 +231,8 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_normal" - android:focusable="false" android:text="@string/risk_details_information_body_notice" + android:focusable="true" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/risk_details_information_body" /> diff --git a/Corona-Warn-App/src/main/res/layout/fragment_settings.xml b/Corona-Warn-App/src/main/res/layout/fragment_settings.xml index a9e1d1e24d53cc45726dee5c6d82393c88958d31..49b89205e701f9fb68e34edc552096efbd3235e2 100644 --- a/Corona-Warn-App/src/main/res/layout/fragment_settings.xml +++ b/Corona-Warn-App/src/main/res/layout/fragment_settings.xml @@ -17,6 +17,9 @@ </data> <androidx.constraintlayout.widget.ConstraintLayout + android:id="@+id/settings_container" + android:contentDescription="@string/settings_title" + android:focusable="true" android:layout_width="match_parent" android:layout_height="match_parent"> diff --git a/Corona-Warn-App/src/main/res/layout/fragment_settings_notifications.xml b/Corona-Warn-App/src/main/res/layout/fragment_settings_notifications.xml index 0a62638a9e415643137a695067aa8cf1fbcba3a9..349df6f6359f13632086862ff4f87a93359f9f05 100644 --- a/Corona-Warn-App/src/main/res/layout/fragment_settings_notifications.xml +++ b/Corona-Warn-App/src/main/res/layout/fragment_settings_notifications.xml @@ -14,6 +14,9 @@ </data> <androidx.constraintlayout.widget.ConstraintLayout + android:id="@+id/settings_notifications_container" + android:contentDescription="@string/settings_notifications_title" + android:focusable="true" android:layout_width="match_parent" android:layout_height="match_parent"> diff --git a/Corona-Warn-App/src/main/res/layout/fragment_settings_reset.xml b/Corona-Warn-App/src/main/res/layout/fragment_settings_reset.xml index 1c5c5143cf9349676ea8e6c4c96c8da6adb86fab..66961944eaa54cebc2808d1fba7ca77f04022c6e 100644 --- a/Corona-Warn-App/src/main/res/layout/fragment_settings_reset.xml +++ b/Corona-Warn-App/src/main/res/layout/fragment_settings_reset.xml @@ -3,6 +3,9 @@ xmlns:app="http://schemas.android.com/apk/res-auto"> <androidx.constraintlayout.widget.ConstraintLayout + android:id="@+id/settings_reset_container" + android:contentDescription="@string/settings_reset_title" + android:focusable="true" android:layout_width="match_parent" android:layout_height="match_parent"> diff --git a/Corona-Warn-App/src/main/res/layout/fragment_settings_tracing.xml b/Corona-Warn-App/src/main/res/layout/fragment_settings_tracing.xml index 4e2f001aaffb49c830a122a1308a2669c5ca49d2..a177b0e9eb52050b02501edd759d9b5143d20ce2 100644 --- a/Corona-Warn-App/src/main/res/layout/fragment_settings_tracing.xml +++ b/Corona-Warn-App/src/main/res/layout/fragment_settings_tracing.xml @@ -19,6 +19,9 @@ </data> <androidx.constraintlayout.widget.ConstraintLayout + android:id="@+id/settings_tracing_container" + android:contentDescription="@string/settings_tracing_title" + android:focusable="true" android:layout_width="match_parent" android:layout_height="match_parent"> @@ -116,6 +119,7 @@ android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_tiny" android:visibility="@{FormatterSettingsHelper.formatTracingStatusVisibilityTracing(tracingViewModel.isTracingEnabled(), settingsViewModel.isBluetoothEnabled(), settingsViewModel.isConnectionEnabled())}" + android:focusable="true" app:layout_constraintEnd_toStartOf="@+id/guideline_end" app:layout_constraintStart_toEndOf="@+id/guideline_start" app:layout_constraintTop_toTopOf="parent"> @@ -136,6 +140,7 @@ android:id="@+id/settings_tracing_status_tracing_circle_progress" android:layout_width="@dimen/spacing_huge" android:layout_height="@dimen/spacing_huge" + android:importantForAccessibility="no" app:circleWidth="@dimen/circle_large_width" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toTopOf="parent" @@ -165,6 +170,7 @@ android:layout_width="@dimen/match_constraint" android:layout_height="wrap_content" android:text="@string/settings_tracing_body_text" + android:focusable="true" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" diff --git a/Corona-Warn-App/src/main/res/layout/fragment_submission_done.xml b/Corona-Warn-App/src/main/res/layout/fragment_submission_done.xml index 78b422fa06bfd7aa4e0750229e56dd27b58c0590..92e8e11e3971b85aa8221a46be91b9ae2b68dc3d 100644 --- a/Corona-Warn-App/src/main/res/layout/fragment_submission_done.xml +++ b/Corona-Warn-App/src/main/res/layout/fragment_submission_done.xml @@ -4,6 +4,8 @@ xmlns:tools="http://schemas.android.com/tools"> <androidx.constraintlayout.widget.ConstraintLayout + android:id="@+id/submission_done_container" + android:contentDescription="@string/submission_done_title" android:layout_width="match_parent" android:layout_height="match_parent" android:fillViewport="true" diff --git a/Corona-Warn-App/src/main/res/layout/fragment_submission_intro.xml b/Corona-Warn-App/src/main/res/layout/fragment_submission_intro.xml index 4423f39b4210742c2d64f0192f3752608803eeb5..cf44b0a02802ae9206f0ded2eb34f726173278e8 100644 --- a/Corona-Warn-App/src/main/res/layout/fragment_submission_intro.xml +++ b/Corona-Warn-App/src/main/res/layout/fragment_submission_intro.xml @@ -9,6 +9,7 @@ android:layout_height="match_parent" android:contentDescription="@string/submission_intro_accessibility_title" android:fillViewport="true" + android:focusable="true" tools:context=".ui.submission.SubmissionIntroFragment"> <include diff --git a/Corona-Warn-App/src/main/res/layout/fragment_submission_positive_other_warning.xml b/Corona-Warn-App/src/main/res/layout/fragment_submission_positive_other_warning.xml index 6a827d2f8e5c48e27577668edc96297294858e6c..638b1c894201a6da1191a8b311e1c360fd2db843 100644 --- a/Corona-Warn-App/src/main/res/layout/fragment_submission_positive_other_warning.xml +++ b/Corona-Warn-App/src/main/res/layout/fragment_submission_positive_other_warning.xml @@ -4,6 +4,8 @@ xmlns:tools="http://schemas.android.com/tools"> <androidx.constraintlayout.widget.ConstraintLayout + android:id="@+id/submission_positive_other_privacy_container" + android:contentDescription="@string/submission_positive_other_warning_title" android:layout_width="match_parent" android:layout_height="match_parent" android:fillViewport="true" @@ -27,9 +29,9 @@ app:layout_constraintBottom_toTopOf="@+id/guideline_action" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="0.0" - app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toBottomOf="@+id/submission_positive_other_warning_header" - app:layout_constraintVertical_bias="0.0" /> + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@+id/submission_positive_other_warning_header" + app:layout_constraintVertical_bias="0.0" /> <Button android:id="@+id/submission_positive_other_warning_button_next" diff --git a/Corona-Warn-App/src/main/res/layout/fragment_submission_qr_code_scan.xml b/Corona-Warn-App/src/main/res/layout/fragment_submission_qr_code_scan.xml index 56ff871076fdc3728eba65a976c58f2ea9f7e861..f39dd6998635cf8e91a74ec18bb209b68d512d67 100644 --- a/Corona-Warn-App/src/main/res/layout/fragment_submission_qr_code_scan.xml +++ b/Corona-Warn-App/src/main/res/layout/fragment_submission_qr_code_scan.xml @@ -2,7 +2,15 @@ <layout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto"> + <data> + + <import type="de.rki.coronawarnapp.util.formatter.FormatterAccessibilityHelper" /> + + </data> + <androidx.constraintlayout.widget.ConstraintLayout + android:id="@+id/submission_qr_code_scan_container" + android:contentDescription="@string/submission_qr_code_scan_title" android:layout_width="match_parent" android:layout_height="match_parent"> @@ -66,7 +74,7 @@ style="@style/iconStable" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:contentDescription="@string/accessibility_close" + android:contentDescription="@{FormatterAccessibilityHelper.formatImage(@string/accessibility_close)" android:src="@drawable/ic_close" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" diff --git a/Corona-Warn-App/src/main/res/layout/fragment_submission_test_result.xml b/Corona-Warn-App/src/main/res/layout/fragment_submission_test_result.xml index a7368ab3d12339aa4500e9338f04970d3fafa398..3f8a927308e11cb9d894bdcc7dda3fb64d65455e 100644 --- a/Corona-Warn-App/src/main/res/layout/fragment_submission_test_result.xml +++ b/Corona-Warn-App/src/main/res/layout/fragment_submission_test_result.xml @@ -12,6 +12,8 @@ </data> <androidx.constraintlayout.widget.ConstraintLayout + android:id="@+id/submission_test_result_container" + android:contentDescription="@string/submission_test_result_headline" android:layout_width="match_parent" android:layout_height="match_parent"> diff --git a/Corona-Warn-App/src/main/res/layout/include_button_icon.xml b/Corona-Warn-App/src/main/res/layout/include_button_icon.xml index 56a5d672356219d4f5e2d50362a978790b98f74d..f98fe479383d1b536e2ddb6e049fc6ae2550235a 100644 --- a/Corona-Warn-App/src/main/res/layout/include_button_icon.xml +++ b/Corona-Warn-App/src/main/res/layout/include_button_icon.xml @@ -6,6 +6,8 @@ <import type="de.rki.coronawarnapp.util.formatter.FormatterHelper" /> + <import type="de.rki.coronawarnapp.util.formatter.FormatterAccessibilityHelper" /> + <variable name="icon" type="android.graphics.drawable.Drawable" /> @@ -19,6 +21,7 @@ <androidx.constraintlayout.widget.ConstraintLayout android:id="@+id/button_icon" style="@style/buttonIcon" + android:contentDescription="@{FormatterAccessibilityHelper.formatButton(iconDescription)}" android:layout_width="wrap_content" android:layout_height="wrap_content" app:layout_constraintStart_toStartOf="parent" @@ -28,8 +31,8 @@ style="@style/icon" android:layout_width="@dimen/icon_size_button" android:layout_height="@dimen/icon_size_button" - android:contentDescription="@{FormatterHelper.formatEmptyString(iconDescription)}" android:src="@{icon}" + android:importantForAccessibility="no" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" diff --git a/Corona-Warn-App/src/main/res/layout/include_dispatcher_card.xml b/Corona-Warn-App/src/main/res/layout/include_dispatcher_card.xml index 4d500b19ee035aaf9fb40e4bc992066d54dca05e..d0a348e06abe21d86ffe8d6e001429b0899626fa 100644 --- a/Corona-Warn-App/src/main/res/layout/include_dispatcher_card.xml +++ b/Corona-Warn-App/src/main/res/layout/include_dispatcher_card.xml @@ -5,6 +5,8 @@ <data> + <import type="de.rki.coronawarnapp.util.formatter.FormatterAccessibilityHelper" /> + <variable name="headline" type="String" /> @@ -30,6 +32,7 @@ <TextView android:id="@+id/dispatcher_card_title" style="@style/headline6" + android:accessibilityHeading="true" android:layout_width="@dimen/match_constraint" android:layout_height="wrap_content" android:layout_marginStart="@dimen/spacing_normal" @@ -49,6 +52,7 @@ android:layout_marginEnd="@dimen/spacing_normal" android:src="@drawable/ic_forward" android:tint="@color/colorTextPrimary1" + android:importantForAccessibility="no" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toTopOf="parent" /> @@ -62,10 +66,12 @@ android:layout_marginEnd="@dimen/spacing_small" android:layout_marginBottom="@dimen/spacing_normal" android:text="@{body}" + android:contentDescription="@{FormatterAccessibilityHelper.formatButton(body)}" + app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toStartOf="@+id/dispatcher_card_illustration" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/dispatcher_card_title" - app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintVertical_bias="0.0" tools:text="@string/submission_dispatcher_qr_card_text" /> <ImageView @@ -74,6 +80,7 @@ android:layout_height="wrap_content" android:layout_marginTop="@dimen/button_icon_margin" android:src="@{illustration}" + android:importantForAccessibility="no" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toBottomOf="@+id/dispatcher_card_icon" diff --git a/Corona-Warn-App/src/main/res/layout/include_header.xml b/Corona-Warn-App/src/main/res/layout/include_header.xml index 4dcf94459addc323cb377eb555afa07af627be13..e30f7bdf8c2e08f26e97e9ef1ab322fdeddd7749 100644 --- a/Corona-Warn-App/src/main/res/layout/include_header.xml +++ b/Corona-Warn-App/src/main/res/layout/include_header.xml @@ -34,12 +34,13 @@ <TextView android:id="@+id/header_title" style="@style/headline6" + android:accessibilityHeading="true" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="@dimen/guideline_body_title" android:text="@{title}" app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintEnd_toEndOf="@id/guideline_end" app:layout_constraintStart_toStartOf="@id/guideline_start" app:layout_constraintTop_toTopOf="parent" tools:text="@string/settings_title" /> @@ -51,6 +52,13 @@ android:orientation="vertical" app:layout_constraintGuide_begin="@dimen/guideline_start" /> + <androidx.constraintlayout.widget.Guideline + android:id="@+id/guideline_end" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:orientation="vertical" + app:layout_constraintGuide_end="@dimen/guideline_end" /> + <androidx.constraintlayout.widget.Guideline android:id="@+id/guideline_back" android:layout_width="wrap_content" diff --git a/Corona-Warn-App/src/main/res/layout/include_information_details.xml b/Corona-Warn-App/src/main/res/layout/include_information_details.xml index 066967d1109e929fd8e1218e1db7d4c51949352d..36d411bdffc8ddcfb2c9ff8226e7ef26a71634e8 100644 --- a/Corona-Warn-App/src/main/res/layout/include_information_details.xml +++ b/Corona-Warn-App/src/main/res/layout/include_information_details.xml @@ -7,6 +7,8 @@ <import type="de.rki.coronawarnapp.util.formatter.FormatterHelper" /> + <import type="de.rki.coronawarnapp.util.formatter.FormatterAccessibilityHelper" /> + <variable name="illustration" type="android.graphics.drawable.Drawable" /> @@ -32,7 +34,8 @@ android:id="@+id/information_details_header_illustration" android:layout_width="0dp" android:layout_height="wrap_content" - android:contentDescription="@{illustrationDescription}" + android:contentDescription="@{FormatterAccessibilityHelper.formatImage(illustrationDescription)}" + android:focusable="true" android:src="@{illustration}" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" @@ -50,6 +53,8 @@ android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_small" + android:accessibilityHeading="true" + android:focusable="true" android:text="@{headline}" android:visibility="@{FormatterHelper.formatVisibilityText(headline)}" app:layout_constraintEnd_toEndOf="@id/guideline_end" @@ -63,6 +68,7 @@ android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_medium" + android:focusable="true" android:text="@{body}" android:visibility="@{FormatterHelper.formatVisibilityText(body)}" app:layout_constraintEnd_toEndOf="@id/guideline_end" diff --git a/Corona-Warn-App/src/main/res/layout/include_main_faq_card.xml b/Corona-Warn-App/src/main/res/layout/include_main_faq_card.xml index 17d2229e0eea029e5cba9c7ca8e091ca2e573706..a146bef26b921da7fdc9926f414be702bbcf1b37 100644 --- a/Corona-Warn-App/src/main/res/layout/include_main_faq_card.xml +++ b/Corona-Warn-App/src/main/res/layout/include_main_faq_card.xml @@ -5,6 +5,7 @@ <androidx.constraintlayout.widget.ConstraintLayout android:id="@+id/main_card" style="@style/card" + android:contentDescription="@string/hint_external_webpage" android:layout_width="match_parent" android:layout_height="wrap_content"> @@ -30,6 +31,7 @@ <TextView android:id="@+id/main_card_header_headline" style="@style/headline5" + android:accessibilityHeading="true" android:layout_width="@dimen/match_constraint" android:layout_height="wrap_content" android:layout_marginStart="@dimen/spacing_small" @@ -43,10 +45,10 @@ <ImageView android:id="@+id/main_card_header_icon_end" style="@style/icon" - android:layout_width="@dimen/icon_size_button" - android:layout_height="@dimen/icon_size_button" + android:layout_width="@dimen/icon_size_external_link" + android:layout_height="@dimen/icon_size_external_link" android:importantForAccessibility="no" - android:src="@drawable/ic_forward" + android:src="@drawable/ic_link" app:layout_constraintBottom_toBottomOf="@+id/main_card_header_headline" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toTopOf="@+id/main_card_header_headline" /> diff --git a/Corona-Warn-App/src/main/res/layout/include_main_overview_glossary.xml b/Corona-Warn-App/src/main/res/layout/include_main_overview_glossary.xml index ca4ae118936199c46c6f118916215b4b3bba42ce..d4c833a58569f77848db9163810471c32b5dcdca 100644 --- a/Corona-Warn-App/src/main/res/layout/include_main_overview_glossary.xml +++ b/Corona-Warn-App/src/main/res/layout/include_main_overview_glossary.xml @@ -33,6 +33,7 @@ <TextView android:id="@+id/main_overview_glossary_subtitle" style="@style/headline6" + android:accessibilityHeading="true" android:layout_width="0dp" android:layout_height="wrap_content" android:text="@{subtitle}" diff --git a/Corona-Warn-App/src/main/res/layout/include_main_overview_row.xml b/Corona-Warn-App/src/main/res/layout/include_main_overview_row.xml index ee264f22662075c8d7791b0935986f153ddb15a8..15111ca19797157ffe7303882ca0aca139422a09 100644 --- a/Corona-Warn-App/src/main/res/layout/include_main_overview_row.xml +++ b/Corona-Warn-App/src/main/res/layout/include_main_overview_row.xml @@ -46,8 +46,7 @@ android:tint="@{FormatterHelper.formatColorIcon(iconTint)}" android:visibility="@{FormatterHelper.formatVisibilityIcon(icon)}" app:layout_constraintBottom_toBottomOf="@+id/main_overview_row_subtitle" - app:layout_constraintEnd_toStartOf="@+id/main_overview_row_subtitle" - app:layout_constraintStart_toStartOf="parent" + app:layout_constraintStart_toStartOf="@+id/guideline_icon" app:layout_constraintTop_toTopOf="@+id/main_overview_row_subtitle" /> <TextView @@ -65,7 +64,14 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="vertical" - app:layout_constraintGuide_begin="@dimen/guideline_body_title" /> + app:layout_constraintGuide_begin="@dimen/guideline_start_divider" /> + + <androidx.constraintlayout.widget.Guideline + android:id="@+id/guideline_icon" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:orientation="vertical" + app:layout_constraintGuide_begin="@dimen/guideline_back" /> </androidx.constraintlayout.widget.ConstraintLayout> diff --git a/Corona-Warn-App/src/main/res/layout/include_main_overview_segment.xml b/Corona-Warn-App/src/main/res/layout/include_main_overview_segment.xml index 7fb81c9ee89b70cb60625ce233381d0dc66306f0..892bb42344cbf24717eca59bdff3286b55b828d1 100644 --- a/Corona-Warn-App/src/main/res/layout/include_main_overview_segment.xml +++ b/Corona-Warn-App/src/main/res/layout/include_main_overview_segment.xml @@ -23,7 +23,7 @@ <androidx.constraintlayout.widget.ConstraintLayout android:id="@+id/main_overview_segment" - style="@style/row" + style="@style/rowSettings" android:layout_width="0dp" android:layout_height="wrap_content" android:focusable="true" @@ -38,7 +38,7 @@ android:importantForAccessibility="no" android:src="@{icon}" app:layout_constraintBottom_toBottomOf="@id/main_overview_segment_subtitle" - app:layout_constraintStart_toStartOf="parent" + app:layout_constraintStart_toStartOf="@+id/guideline_icon" app:layout_constraintTop_toTopOf="@id/main_overview_segment_subtitle" /> <TextView @@ -46,6 +46,7 @@ style="@style/headline5" android:layout_width="0dp" android:layout_height="wrap_content" + android:accessibilityHeading="true" android:focusable="false" android:text="@{subtitle}" app:layout_constraintEnd_toEndOf="parent" @@ -70,7 +71,14 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="vertical" - app:layout_constraintGuide_begin="@dimen/guideline_body_title" /> + app:layout_constraintGuide_begin="@dimen/guideline_start_divider" /> + + <androidx.constraintlayout.widget.Guideline + android:id="@+id/guideline_icon" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:orientation="vertical" + app:layout_constraintGuide_begin="@dimen/guideline_back" /> </androidx.constraintlayout.widget.ConstraintLayout> diff --git a/Corona-Warn-App/src/main/res/layout/include_navigation_row.xml b/Corona-Warn-App/src/main/res/layout/include_navigation_row.xml index 0092de70be966880ba68f3672b156e30f1fbb05e..0254b11d32f6459ffd8f5b0e54e33203dc2ac7fb 100644 --- a/Corona-Warn-App/src/main/res/layout/include_navigation_row.xml +++ b/Corona-Warn-App/src/main/res/layout/include_navigation_row.xml @@ -31,6 +31,7 @@ style="@style/row" android:layout_width="0dp" android:layout_height="wrap_content" + android:focusable="true" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent"> @@ -41,7 +42,7 @@ android:layout_width="@dimen/icon_size_settings" android:layout_height="@dimen/icon_size_settings" android:layout_marginEnd="@dimen/spacing_small" - android:contentDescription="@string/lorem_ipsum" + android:importantForAccessibility="no" android:src="@{icon}" android:visibility="@{FormatterHelper.formatVisibilityIcon(icon)}" app:layout_constraintBottom_toBottomOf="parent" diff --git a/Corona-Warn-App/src/main/res/layout/include_onboarding.xml b/Corona-Warn-App/src/main/res/layout/include_onboarding.xml index 03d9af5c84b9f0f5a26ce68bdeb9ba6a6687885a..c9fa1240ce949d9b7d269350dd071b2ce2488ef1 100644 --- a/Corona-Warn-App/src/main/res/layout/include_onboarding.xml +++ b/Corona-Warn-App/src/main/res/layout/include_onboarding.xml @@ -7,6 +7,8 @@ <import type="de.rki.coronawarnapp.util.formatter.FormatterHelper" /> + <import type="de.rki.coronawarnapp.util.formatter.FormatterAccessibilityHelper" /> + <variable name="illustration" type="android.graphics.drawable.Drawable" /> @@ -47,15 +49,15 @@ <androidx.constraintlayout.widget.ConstraintLayout android:layout_width="match_parent" - android:layout_height="wrap_content" - android:focusable="true"> + android:layout_height="wrap_content"> <ImageView android:id="@+id/onboarding_illustration" android:layout_width="0dp" android:layout_height="wrap_content" - android:contentDescription="@{illustrationDescription}" + android:contentDescription="@{FormatterAccessibilityHelper.formatImage(illustrationDescription)}" android:src="@{illustration}" + android:focusable="true" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" @@ -64,11 +66,12 @@ <TextView android:id="@+id/onboarding_headline" style="@style/headline4" + android:accessibilityHeading="true" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_normal" - android:focusable="false" android:text="@{headline}" + android:focusable="true" app:layout_constraintEnd_toEndOf="@id/guideline_end" app:layout_constraintStart_toStartOf="@id/guideline_start" app:layout_constraintTop_toBottomOf="@+id/onboarding_illustration" @@ -80,9 +83,9 @@ android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_normal" - android:focusable="false" android:text="@{subtitle}" android:visibility="@{FormatterHelper.formatVisibilityText(subtitle)}" + android:focusable="true" app:layout_constraintEnd_toEndOf="@id/guideline_end" app:layout_constraintStart_toStartOf="@id/guideline_start" app:layout_constraintTop_toBottomOf="@+id/onboarding_headline" @@ -94,8 +97,8 @@ android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_normal" - android:focusable="false" android:text="@{body}" + android:focusable="true" app:layout_constraintEnd_toEndOf="@id/guideline_end" app:layout_constraintStart_toStartOf="@id/guideline_start" app:layout_constraintTop_toBottomOf="@+id/onboarding_subtitle" @@ -107,9 +110,9 @@ android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_normal" - android:focusable="false" android:text="@{bodyEmphasized}" android:visibility="@{FormatterHelper.formatVisibilityText(bodyEmphasized)}" + android:focusable="true" app:layout_constraintEnd_toEndOf="@id/guideline_end" app:layout_constraintStart_toStartOf="@id/guideline_start" app:layout_constraintTop_toBottomOf="@id/onboarding_body" @@ -124,6 +127,7 @@ android:visibility="@{FormatterHelper.formatVisibilityText(headlineCard)}" app:body="@{bodyCard}" app:headline="@{headlineCard}" + android:focusable="true" app:layout_constraintEnd_toStartOf="@+id/guideline_card_end" app:layout_constraintStart_toStartOf="@+id/guideline_card_start" app:layout_constraintTop_toBottomOf="@+id/onboarding_body_emphasized" /> diff --git a/Corona-Warn-App/src/main/res/layout/include_privacy_card.xml b/Corona-Warn-App/src/main/res/layout/include_privacy_card.xml index fa592e659e4314b1f4202221ed48729c6dc3c015..6da5f3ec6e4458480425f966ed77f814ee1e7a03 100644 --- a/Corona-Warn-App/src/main/res/layout/include_privacy_card.xml +++ b/Corona-Warn-App/src/main/res/layout/include_privacy_card.xml @@ -13,9 +13,11 @@ <TextView android:id="@+id/privacy_card_title" style="@style/headline6" + android:accessibilityHeading="true" android:layout_width="@dimen/match_constraint" android:layout_height="wrap_content" android:text="@string/submission_positive_other_warning_privacy_title" + android:focusable="true" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> @@ -27,6 +29,7 @@ android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_normal" android:text="@string/submission_positive_other_warning_privacy_body" + android:focusable="true" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/privacy_card_title" /> diff --git a/Corona-Warn-App/src/main/res/layout/include_risk_card_header.xml b/Corona-Warn-App/src/main/res/layout/include_risk_card_header.xml index 4d85a537f3f856cd865a1756c04b7b6db3c381cb..2d6f57a24961f13e48530f1cd51232507d94742b 100644 --- a/Corona-Warn-App/src/main/res/layout/include_risk_card_header.xml +++ b/Corona-Warn-App/src/main/res/layout/include_risk_card_header.xml @@ -13,7 +13,7 @@ <variable name="tracingViewModel" type="de.rki.coronawarnapp.ui.viewmodel.TracingViewModel" /> - <!-- todo include 'x' button? --> + <variable name="showDetails" type="Boolean" /> @@ -25,6 +25,7 @@ <TextView android:id="@+id/risk_card_header_headline" + android:accessibilityHeading="true" style="@style/headline5" android:layout_width="0dp" android:layout_height="wrap_content" diff --git a/Corona-Warn-App/src/main/res/layout/include_risk_details_behavior_row.xml b/Corona-Warn-App/src/main/res/layout/include_risk_details_behavior_row.xml index a58fad41380b545768d741874b60ad24e9d947c6..3049fb21f3524a37f342f1f2a5c5fa4b3323658b 100644 --- a/Corona-Warn-App/src/main/res/layout/include_risk_details_behavior_row.xml +++ b/Corona-Warn-App/src/main/res/layout/include_risk_details_behavior_row.xml @@ -55,7 +55,6 @@ android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="@dimen/spacing_small" - android:focusable="false" android:text="@{body}" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" diff --git a/Corona-Warn-App/src/main/res/layout/include_row.xml b/Corona-Warn-App/src/main/res/layout/include_row.xml index 17a0cd024104cc29ee12182bad3d92789ab83bbc..1f5997334910cc2f9d2496bc5c6b26dca5697743 100644 --- a/Corona-Warn-App/src/main/res/layout/include_row.xml +++ b/Corona-Warn-App/src/main/res/layout/include_row.xml @@ -41,28 +41,29 @@ app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent"> - <ImageView - android:layout_width="@dimen/icon_size_main_card" - android:layout_height="@dimen/icon_size_main_card" - android:importantForAccessibility="no" - android:src="@{icon}" - android:tint="@{FormatterHelper.formatColorIcon(iconTint)}" - android:visibility="@{FormatterHelper.formatVisibilityIcon(icon)}" - app:layout_constraintBottom_toBottomOf="@+id/main_row_item_subtitle" - app:layout_constraintEnd_toStartOf="@+id/main_row_item_subtitle" - app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toTopOf="@+id/main_row_item_subtitle" /> - <TextView android:id="@+id/main_row_item_subtitle" style="@style/subtitle" android:layout_width="0dp" android:layout_height="wrap_content" + android:layout_marginEnd="@dimen/spacing_tiny" android:text="@{subtitle}" - app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintEnd_toStartOf="@+id/main_row_item_icon" app:layout_constraintStart_toEndOf="@+id/guideline_body" app:layout_constraintTop_toTopOf="parent" /> + <ImageView + android:id="@+id/main_row_item_icon" + style="@style/icon" + android:layout_width="@dimen/icon_size_external_link" + android:layout_height="@dimen/icon_size_external_link" + android:importantForAccessibility="no" + android:src="@{icon}" + android:visibility="@{FormatterHelper.formatVisibilityIcon(icon)}" + app:layout_constraintBottom_toBottomOf="@+id/main_row_item_subtitle" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintTop_toTopOf="@+id/main_row_item_subtitle" /> + <androidx.constraintlayout.widget.Guideline android:id="@+id/guideline_body" android:layout_width="wrap_content" diff --git a/Corona-Warn-App/src/main/res/layout/include_settings_switch_row.xml b/Corona-Warn-App/src/main/res/layout/include_settings_switch_row.xml index 1b8527107cbdad6a0e14a60936190d4bcde98542..8fc6534d9ea13c360164d3a1f7d761b48d50e362 100644 --- a/Corona-Warn-App/src/main/res/layout/include_settings_switch_row.xml +++ b/Corona-Warn-App/src/main/res/layout/include_settings_switch_row.xml @@ -41,6 +41,7 @@ style="@style/row" android:layout_width="0dp" android:layout_height="wrap_content" + android:focusable="true" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent"> @@ -71,6 +72,7 @@ android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_mega_tiny" + android:accessibilityLiveRegion="assertive" android:text="@{statusText}" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" @@ -85,6 +87,7 @@ android:layout_height="wrap_content" android:checked="@{status}" android:enabled="@{enabled}" + android:contentDescription="@{FormatterSettingsHelper.formatSwitchContentDescription(subtitle, statusText)}" android:theme="@style/switchBase" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" diff --git a/Corona-Warn-App/src/main/res/layout/include_step_entry_simple_body.xml b/Corona-Warn-App/src/main/res/layout/include_step_entry_simple_body.xml index f1b938eca4dbfe08adb6740deacff6a13ce1e1dd..b10fe9614a877033f9eee5d0481aba274d845421 100644 --- a/Corona-Warn-App/src/main/res/layout/include_step_entry_simple_body.xml +++ b/Corona-Warn-App/src/main/res/layout/include_step_entry_simple_body.xml @@ -8,6 +8,7 @@ <TextView android:id="@+id/simple_step_entry_title" style="@style/headline6" + android:accessibilityHeading="true" android:layout_width="@dimen/match_constraint" android:layout_height="wrap_content" app:layout_constraintEnd_toEndOf="parent" diff --git a/Corona-Warn-App/src/main/res/layout/include_submission_contact.xml b/Corona-Warn-App/src/main/res/layout/include_submission_contact.xml index 4394189dd68f2372960116d254b61ebb0f48cae1..86fa23f9c3917f8209161d944b8332ddb9b8d259 100644 --- a/Corona-Warn-App/src/main/res/layout/include_submission_contact.xml +++ b/Corona-Warn-App/src/main/res/layout/include_submission_contact.xml @@ -2,20 +2,27 @@ <layout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto"> + <data> + + <import type="de.rki.coronawarnapp.util.formatter.FormatterAccessibilityHelper" /> + + </data> + <ScrollView android:layout_width="match_parent" android:layout_height="match_parent"> <androidx.constraintlayout.widget.ConstraintLayout android:layout_width="match_parent" - android:layout_height="wrap_content" - android:focusable="true"> + android:layout_height="wrap_content"> <ImageView android:id="@+id/submission_contact_illustration" android:layout_width="@dimen/match_constraint" android:layout_height="wrap_content" android:src="@drawable/ic_submission_illustration_hotline" + android:contentDescription="@{FormatterAccessibilityHelper.formatImage(@string/information_contact_illustration_description)}" + android:focusable="true" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> @@ -26,8 +33,8 @@ android:layout_width="@dimen/match_constraint" android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_small" - android:focusable="false" android:text="@string/submission_contact_body" + android:focusable="true" app:layout_constraintEnd_toStartOf="@+id/guideline_end" app:layout_constraintStart_toStartOf="@+id/guideline_start" app:layout_constraintTop_toBottomOf="@id/submission_contact_illustration" /> @@ -35,11 +42,12 @@ <TextView android:id="@+id/submission_contact_headline" style="@style/headline5" + android:accessibilityHeading="true" android:layout_width="@dimen/match_constraint" android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_medium" - android:focusable="false" android:text="@string/submission_contact_headline" + android:focusable="true" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="@id/guideline_start" app:layout_constraintTop_toBottomOf="@+id/submission_contact_body" /> @@ -49,6 +57,7 @@ android:layout_width="@dimen/match_constraint" android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_normal" + android:focusable="true" android:contentDescription="@string/submission_contact_step_1_content" app:layout_constraintEnd_toStartOf="@+id/guideline_end" app:layout_constraintStart_toStartOf="@+id/guideline_start" @@ -74,6 +83,7 @@ <TextView android:id="@+id/submission_contact_step_1_number" style="@style/headline5" + android:accessibilityHeading="true" android:layout_width="@dimen/match_constraint" android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_small" @@ -102,6 +112,7 @@ android:id="@+id/submission_contact_step_2" android:layout_width="@dimen/match_constraint" android:layout_height="wrap_content" + android:focusable="true" android:contentDescription="@string/submission_contact_step_2_content" app:layout_constraintEnd_toStartOf="@+id/guideline_end" app:layout_constraintStart_toStartOf="@+id/guideline_start" diff --git a/Corona-Warn-App/src/main/res/layout/include_submission_dispatcher.xml b/Corona-Warn-App/src/main/res/layout/include_submission_dispatcher.xml index 6cca2badd71a21b4258853bf6a87279d1888fb36..d251147351bdf7af7d9402b9ee0b9a934ab3a923 100644 --- a/Corona-Warn-App/src/main/res/layout/include_submission_dispatcher.xml +++ b/Corona-Warn-App/src/main/res/layout/include_submission_dispatcher.xml @@ -19,6 +19,7 @@ android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_normal" android:text="@string/submission_dispatcher_subheadline" + android:focusable="true" app:layout_constraintEnd_toStartOf="@+id/guideline_end" app:layout_constraintStart_toStartOf="@+id/guideline_start" app:layout_constraintTop_toTopOf="parent" /> @@ -44,6 +45,8 @@ android:layout_width="@dimen/match_constraint" android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_small" + android:clickable="true" + android:focusable="true" app:body="@{@string/submission_dispatcher_tan_code_card_text}" app:headline="@{@string/submission_dispatcher_card_tan_code}" app:illustration="@{@drawable/ic_submission_illustration_tan_code_card}" @@ -57,10 +60,11 @@ android:layout_width="@dimen/match_constraint" android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_small" + android:clickable="true" + android:focusable="true" app:body="@{@string/submission_dispatcher_tan_tele_card_text}" app:headline="@{@string/submission_dispatcher_card_tan_tele}" app:illustration="@{@drawable/ic_submission_illustration_tan_hotline_card}" - app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toStartOf="@+id/guideline_card_end" app:layout_constraintStart_toStartOf="@+id/guideline_card_start" app:layout_constraintTop_toBottomOf="@+id/submission_dispatcher_tan_code" /> diff --git a/Corona-Warn-App/src/main/res/layout/include_submission_done.xml b/Corona-Warn-App/src/main/res/layout/include_submission_done.xml index 683bd1f3f28f3b8b349e8d4d6d6e4a41ed7757f2..811b74fdb96ea3022ea535b42d1eb74a47d9df21 100644 --- a/Corona-Warn-App/src/main/res/layout/include_submission_done.xml +++ b/Corona-Warn-App/src/main/res/layout/include_submission_done.xml @@ -2,6 +2,12 @@ <layout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto"> + <data> + + <import type="de.rki.coronawarnapp.util.formatter.FormatterAccessibilityHelper" /> + + </data> + <ScrollView android:layout_width="match_parent" android:layout_height="match_parent"> @@ -15,8 +21,8 @@ android:id="@+id/submission_done_hero_illustration" android:layout_width="@dimen/match_constraint" android:layout_height="wrap_content" - android:contentDescription="@string/submission_done_illustration_description" - android:importantForAccessibility="no" + android:contentDescription="@{FormatterAccessibilityHelper.formatImage(@string/submission_done_illustration_description)}" + android:focusable="true" android:src="@drawable/ic_submission_illustration_thanks" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" @@ -25,10 +31,12 @@ <TextView android:id="@+id/submission_done_headline" style="@style/headline4" + android:accessibilityHeading="true" android:layout_width="@dimen/match_constraint" android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_normal" android:text="@string/submission_done_title" + android:focusable="true" app:layout_constraintEnd_toEndOf="@id/guideline_end" app:layout_constraintStart_toStartOf="@id/guideline_start" app:layout_constraintTop_toBottomOf="@+id/submission_done_hero_illustration" /> diff --git a/Corona-Warn-App/src/main/res/layout/include_submission_done_content.xml b/Corona-Warn-App/src/main/res/layout/include_submission_done_content.xml index 10e9634c8bc14606f76a4816a626206d8d078d2e..a988e9685244c9409f8c640b6449bef429b1ebcc 100644 --- a/Corona-Warn-App/src/main/res/layout/include_submission_done_content.xml +++ b/Corona-Warn-App/src/main/res/layout/include_submission_done_content.xml @@ -22,6 +22,7 @@ android:layout_width="@dimen/match_constraint" android:layout_height="wrap_content" android:text="@string/submission_done_body" + android:focusable="true" app:layout_constraintEnd_toEndOf="@+id/guideline_end" app:layout_constraintStart_toStartOf="@+id/guideline_start" app:layout_constraintTop_toTopOf="parent" /> @@ -29,10 +30,12 @@ <TextView android:id="@+id/submission_done_subtitle" style="@style/headline5" + android:accessibilityHeading="true" android:layout_width="@dimen/match_constraint" android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_normal" android:text="@string/submission_done_subtitle" + android:focusable="true" app:layout_constraintEnd_toEndOf="@+id/guideline_end" app:layout_constraintStart_toStartOf="@+id/guideline_start" app:layout_constraintTop_toBottomOf="@+id/submission_done_text" /> diff --git a/Corona-Warn-App/src/main/res/layout/include_submission_done_further_info.xml b/Corona-Warn-App/src/main/res/layout/include_submission_done_further_info.xml index 708f6a0a7f05206ed181f8270a89133d09c660af..9b7f903402407811d8be2224dff743d7d303b961 100644 --- a/Corona-Warn-App/src/main/res/layout/include_submission_done_further_info.xml +++ b/Corona-Warn-App/src/main/res/layout/include_submission_done_further_info.xml @@ -13,8 +13,10 @@ <TextView android:id="@+id/further_info_title" style="@style/headline5" + android:accessibilityHeading="true" android:layout_width="@dimen/match_constraint" android:layout_height="wrap_content" + android:focusable="true" android:text="@string/submission_done_further_info_title" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" @@ -24,6 +26,7 @@ android:id="@+id/further_info_text" android:layout_width="@dimen/match_constraint" android:layout_height="wrap_content" + android:focusable="true" android:layout_marginTop="@dimen/spacing_normal" app:entries="@array/submission_done_further_info_bullet_points" app:layout_constraintEnd_toEndOf="parent" diff --git a/Corona-Warn-App/src/main/res/layout/include_submission_intro.xml b/Corona-Warn-App/src/main/res/layout/include_submission_intro.xml index 11f872f44b063d6e48aa98083560d9c51e786daf..7bcfd2f39d5620c56774b76b6de5c6112644e190 100644 --- a/Corona-Warn-App/src/main/res/layout/include_submission_intro.xml +++ b/Corona-Warn-App/src/main/res/layout/include_submission_intro.xml @@ -2,22 +2,27 @@ <layout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto"> + <data> + + <import type="de.rki.coronawarnapp.util.formatter.FormatterAccessibilityHelper" /> + + </data> + <ScrollView android:layout_width="match_parent" android:layout_height="match_parent"> <androidx.constraintlayout.widget.ConstraintLayout android:layout_width="match_parent" - android:layout_height="wrap_content" - android:focusable="true"> + android:layout_height="wrap_content"> <ImageView android:id="@+id/submission_intro_hero_illustration" - contentDescription="@{@string/submission_intro_illustration_description}" + android:contentDescription="@{FormatterAccessibilityHelper.formatImage(@string/submission_intro_illustration_description)}" android:layout_width="@dimen/match_constraint" android:layout_height="wrap_content" - android:importantForAccessibility="no" android:src="@drawable/ic_illustration_test" + android:focusable="true" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> @@ -25,11 +30,12 @@ <TextView android:id="@+id/submission_intro_headline" style="@style/headline4" + android:accessibilityHeading="true" android:layout_width="@dimen/match_constraint" android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_normal" - android:focusable="false" android:text="@string/submission_intro_headline" + android:focusable="true" app:layout_constraintEnd_toEndOf="@id/guideline_end" app:layout_constraintStart_toStartOf="@id/guideline_start" app:layout_constraintTop_toBottomOf="@+id/submission_intro_hero_illustration" /> @@ -40,8 +46,8 @@ android:layout_width="@dimen/match_constraint" android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_normal" - android:focusable="false" android:text="@string/submission_intro_text" + android:focusable="true" app:layout_constraintEnd_toEndOf="@id/guideline_end" app:layout_constraintStart_toStartOf="@id/guideline_start" app:layout_constraintTop_toBottomOf="@+id/submission_intro_headline" /> @@ -49,9 +55,10 @@ <de.rki.coronawarnapp.ui.view.BulletPointList android:layout_width="@dimen/match_constraint" android:layout_height="wrap_content" - android:focusable="false" android:paddingBottom="@dimen/spacing_normal" app:entries="@array/submission_intro_bullet_points" + android:layout_marginTop="@dimen/spacing_normal" + android:focusable="true" app:layout_constraintEnd_toEndOf="@id/guideline_end" app:layout_constraintStart_toStartOf="@id/guideline_start" app:layout_constraintTop_toBottomOf="@id/submission_intro_text" /> diff --git a/Corona-Warn-App/src/main/res/layout/include_submission_positive_other_warning.xml b/Corona-Warn-App/src/main/res/layout/include_submission_positive_other_warning.xml index d2c5844584603ffc6f1da6f546009231e72d38c2..9e33eb17669cbca920db59c406c4c430e0ac6105 100644 --- a/Corona-Warn-App/src/main/res/layout/include_submission_positive_other_warning.xml +++ b/Corona-Warn-App/src/main/res/layout/include_submission_positive_other_warning.xml @@ -2,6 +2,12 @@ <layout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto"> + <data> + + <import type="de.rki.coronawarnapp.util.formatter.FormatterAccessibilityHelper" /> + + </data> + <ScrollView android:layout_width="match_parent" android:layout_height="match_parent"> @@ -14,8 +20,7 @@ android:id="@+id/submission_positive_other_warning_hero_illustration" android:layout_width="@dimen/match_constraint" android:layout_height="wrap_content" - android:contentDescription="@string/submission_positive_other_illustration_description" - android:importantForAccessibility="no" + android:contentDescription="@{FormatterAccessibilityHelper.formatButton(@string/submission_positive_other_illustration_description)}" android:src="@drawable/ic_submission_illustration_other_warning" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" @@ -23,11 +28,13 @@ <TextView android:id="@+id/submission_positive_other_warning_headline" + android:accessibilityHeading="true" style="@style/headline5" android:layout_width="@dimen/match_constraint" android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_normal" android:text="@string/submission_positive_other_warning_headline" + android:focusable="true" app:layout_constraintEnd_toEndOf="@id/guideline_end" app:layout_constraintStart_toStartOf="@id/guideline_start" app:layout_constraintTop_toBottomOf="@+id/submission_positive_other_warning_hero_illustration" /> @@ -38,6 +45,7 @@ android:layout_width="@dimen/match_constraint" android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_normal" + android:focusable="true" android:text="@string/submission_positive_other_warning_body" app:layout_constraintEnd_toEndOf="@id/guideline_end" app:layout_constraintStart_toStartOf="@id/guideline_start" diff --git a/Corona-Warn-App/src/main/res/layout/include_submission_status_card_content.xml b/Corona-Warn-App/src/main/res/layout/include_submission_status_card_content.xml index 6d11a80ed55aa00f5aff1fe802dece9376dc78b0..e66130292fa770caf7500732e80a309354ccce92 100644 --- a/Corona-Warn-App/src/main/res/layout/include_submission_status_card_content.xml +++ b/Corona-Warn-App/src/main/res/layout/include_submission_status_card_content.xml @@ -22,6 +22,7 @@ <TextView android:id="@+id/submission_status_card_content_title" style="@style/headline5" + android:accessibilityHeading="true" android:layout_width="@dimen/match_constraint" android:layout_height="wrap_content" android:layout_marginStart="@dimen/card_padding" @@ -93,6 +94,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="@{FormatterSubmissionHelper.formatSubmissionStatusCardContentIcon(deviceUIState)}" + android:importantForAccessibility="no" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toTopOf="@id/submission_status_card_content_title" tools:src="@drawable/ic_main_illustration_negative" /> diff --git a/Corona-Warn-App/src/main/res/layout/include_submission_status_card_done.xml b/Corona-Warn-App/src/main/res/layout/include_submission_status_card_done.xml index c6a968cecdf3224d0f420a46801d7a6e2a317864..44aae6bb807ed617ca3bf333ec91a1ca86949b9e 100644 --- a/Corona-Warn-App/src/main/res/layout/include_submission_status_card_done.xml +++ b/Corona-Warn-App/src/main/res/layout/include_submission_status_card_done.xml @@ -12,6 +12,7 @@ <TextView android:id="@+id/submission_done_card_title" style="@style/headline5" + android:accessibilityHeading="true" android:layout_width="@dimen/match_constraint" android:layout_height="wrap_content" android:layout_marginStart="@dimen/spacing_normal" diff --git a/Corona-Warn-App/src/main/res/layout/include_submission_status_card_fetching.xml b/Corona-Warn-App/src/main/res/layout/include_submission_status_card_fetching.xml index 9b8209f5db50b9edc98a257481037139ca7f6c84..46c1d6cb61996e1e794d70ca2cd3959acede1ca1 100644 --- a/Corona-Warn-App/src/main/res/layout/include_submission_status_card_fetching.xml +++ b/Corona-Warn-App/src/main/res/layout/include_submission_status_card_fetching.xml @@ -12,6 +12,7 @@ <TextView android:id="@+id/submission_status_card_fetching_title" style="@style/headline5" + android:accessibilityHeading="true" android:layout_width="@dimen/match_constraint" android:layout_height="wrap_content" android:text="@string/submission_status_card_title_fetching" diff --git a/Corona-Warn-App/src/main/res/layout/include_submission_status_card_positive.xml b/Corona-Warn-App/src/main/res/layout/include_submission_status_card_positive.xml index 702b27048b15207536c16f3e095a8af6e2735cf2..0b1b0a1cae9a62c9ec7e2bb852ba2c9c63ff1bdc 100644 --- a/Corona-Warn-App/src/main/res/layout/include_submission_status_card_positive.xml +++ b/Corona-Warn-App/src/main/res/layout/include_submission_status_card_positive.xml @@ -22,6 +22,7 @@ <TextView android:id="@+id/submission_status_card_positive_title" style="@style/headline5" + android:accessibilityHeading="true" android:layout_width="@dimen/match_constraint" android:layout_height="wrap_content" android:layout_marginEnd="@dimen/spacing_small" @@ -64,6 +65,7 @@ <TextView android:id="@+id/submission_status_card_positive_result_subtitle" style="@style/headline5" + android:accessibilityHeading="true" android:layout_width="@dimen/match_constraint" android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_normal" diff --git a/Corona-Warn-App/src/main/res/layout/include_submission_status_card_unregistered.xml b/Corona-Warn-App/src/main/res/layout/include_submission_status_card_unregistered.xml index 491428bf7198015b5a30fe9f504db7ed548df95a..bdece7afdf31a9d7edfc2ca41a78ab1f7daa3fae 100644 --- a/Corona-Warn-App/src/main/res/layout/include_submission_status_card_unregistered.xml +++ b/Corona-Warn-App/src/main/res/layout/include_submission_status_card_unregistered.xml @@ -13,6 +13,7 @@ <TextView android:id="@+id/submission_status_card_unregistered_title" style="@style/headline5" + android:accessibilityHeading="true" android:layout_width="@dimen/match_constraint" android:layout_height="wrap_content" android:layout_marginStart="@dimen/card_padding" @@ -58,6 +59,7 @@ android:id="@+id/submission_status_card_unregistered_icon" android:layout_width="wrap_content" android:layout_height="wrap_content" + android:importantForAccessibility="no" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toTopOf="@+id/submission_status_card_unregistered_title" app:srcCompat="@drawable/ic_main_illustration_untested" /> diff --git a/Corona-Warn-App/src/main/res/layout/include_submission_tan.xml b/Corona-Warn-App/src/main/res/layout/include_submission_tan.xml index b86713c29c6865f66be70d38e61475cd142113e0..e1b02f87c6ae918d87c68cd9ab4e288b091044e6 100644 --- a/Corona-Warn-App/src/main/res/layout/include_submission_tan.xml +++ b/Corona-Warn-App/src/main/res/layout/include_submission_tan.xml @@ -1,6 +1,7 @@ <?xml version="1.0" encoding="utf-8"?> <layout xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:app="http://schemas.android.com/apk/res-auto"> + xmlns:app="http://schemas.android.com/apk/res-auto" + xmlns:tools="http://schemas.android.com/tools"> <data> @@ -52,10 +53,11 @@ android:accessibilityLiveRegion="assertive" android:text="@string/submission_tan_character_error" android:textColor="@color/colorTextSemanticRed" - android:visibility="@{FormatterSubmissionHelper.formatShowTanCharacterError(viewmodel.tanCharactersValid, viewmodel.tanChecksumValid)}" + android:visibility="gone" app:layout_constraintEnd_toStartOf="@+id/guideline_end" app:layout_constraintStart_toStartOf="@+id/guideline_start" - app:layout_constraintTop_toBottomOf="@id/submission_tan_input" /> + app:layout_constraintTop_toBottomOf="@id/submission_tan_input" + tools:visibility="visible" /> <TextView android:id="@+id/submission_tan_error" @@ -66,10 +68,11 @@ android:accessibilityLiveRegion="assertive" android:text="@string/submission_tan_error" android:textColor="@color/colorTextSemanticRed" - android:visibility="@{FormatterHelper.formatVisibility(!viewmodel.tanChecksumValid)}" + android:visibility="gone" app:layout_constraintEnd_toStartOf="@+id/guideline_end" app:layout_constraintStart_toStartOf="@+id/guideline_start" - app:layout_constraintTop_toBottomOf="@id/submission_tan_input" /> + app:layout_constraintTop_toBottomOf="@id/submission_tan_character_error" + tools:visibility="visible" /> <include layout="@layout/merge_guidelines_side" /> diff --git a/Corona-Warn-App/src/main/res/layout/include_submission_test_result.xml b/Corona-Warn-App/src/main/res/layout/include_submission_test_result.xml index 1baf0257afbf7527f8ea0ec7a3cfcef02dbc712c..a479ec1ccef516e263981980d36a0670e4e3f91f 100644 --- a/Corona-Warn-App/src/main/res/layout/include_submission_test_result.xml +++ b/Corona-Warn-App/src/main/res/layout/include_submission_test_result.xml @@ -35,6 +35,7 @@ <TextView android:id="@+id/submission_test_result_subtitle" style="@style/headline5" + android:accessibilityHeading="true" android:layout_width="@dimen/match_constraint" android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_medium" diff --git a/Corona-Warn-App/src/main/res/layout/include_submission_test_result_negative_further_info.xml b/Corona-Warn-App/src/main/res/layout/include_submission_test_result_negative_further_info.xml index 7beff057f55c5fbff3707df6bcc029a099142c5b..c5991128a1817d8db3a2fd86419d1d322b1c14e8 100644 --- a/Corona-Warn-App/src/main/res/layout/include_submission_test_result_negative_further_info.xml +++ b/Corona-Warn-App/src/main/res/layout/include_submission_test_result_negative_further_info.xml @@ -13,6 +13,7 @@ <TextView android:id="@+id/further_info_title" style="@style/headline5" + android:accessibilityHeading="true" android:layout_width="@dimen/match_constraint" android:layout_height="wrap_content" android:text="@string/test_result_card_negative_further_info_title" diff --git a/Corona-Warn-App/src/main/res/layout/include_test_result_card.xml b/Corona-Warn-App/src/main/res/layout/include_test_result_card.xml index d0704542a6ecddd5a48c6ecaa73bf77b62414fe9..26fe1d9e97601633d2150b65994e6e802f08fd56 100644 --- a/Corona-Warn-App/src/main/res/layout/include_test_result_card.xml +++ b/Corona-Warn-App/src/main/res/layout/include_test_result_card.xml @@ -20,11 +20,13 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@drawable/card_dark" + android:focusable="true" android:padding="@dimen/card_padding"> <TextView android:id="@+id/test_result_card_headline" style="@style/body2" + android:accessibilityHeading="true" android:layout_width="@dimen/match_constraint" android:layout_height="wrap_content" android:layout_marginEnd="@dimen/spacing_small" @@ -52,6 +54,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="@{FormatterSubmissionHelper.formatTestStatusIcon(deviceUIState)}" + android:importantForAccessibility="no" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toTopOf="parent" tools:src="@drawable/ic_test_result_illustration_negative" /> diff --git a/Corona-Warn-App/src/main/res/layout/include_test_result_card_positive.xml b/Corona-Warn-App/src/main/res/layout/include_test_result_card_positive.xml index e6f3bf2a7d2cd37c7515d69cb4ba2bbee12685da..0b91e0f511903d98a7a3f33cdac7b738d5fd1c7c 100644 --- a/Corona-Warn-App/src/main/res/layout/include_test_result_card_positive.xml +++ b/Corona-Warn-App/src/main/res/layout/include_test_result_card_positive.xml @@ -5,11 +5,13 @@ <androidx.constraintlayout.widget.ConstraintLayout android:layout_width="match_parent" - android:layout_height="wrap_content"> + android:layout_height="wrap_content" + android:focusable="true"> <TextView android:id="@+id/test_result_card_positive_title" style="@style/headline6" + android:accessibilityHeading="true" android:layout_width="@dimen/match_constraint" android:layout_height="wrap_content" android:layout_marginEnd="@dimen/spacing_small" @@ -23,6 +25,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="@drawable/ic_test_result_illustration_positive_card" + android:importantForAccessibility="no" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toTopOf="parent" tools:src="@drawable/ic_test_result_illustration_positive" /> diff --git a/Corona-Warn-App/src/main/res/layout/include_tracing_status_card.xml b/Corona-Warn-App/src/main/res/layout/include_tracing_status_card.xml index 9d5c53f07cf188e7ff4ab4be22667ff4ea51493b..e28b2fc320da0ab759b2f55206b8a5d16386ebee 100644 --- a/Corona-Warn-App/src/main/res/layout/include_tracing_status_card.xml +++ b/Corona-Warn-App/src/main/res/layout/include_tracing_status_card.xml @@ -6,6 +6,8 @@ <import type="de.rki.coronawarnapp.util.formatter.FormatterHelper" /> + <import type="de.rki.coronawarnapp.util.formatter.FormatterAccessibilityHelper" /> + <import type="android.view.View" /> <variable @@ -35,7 +37,8 @@ android:id="@+id/tracing_status_card" style="@style/cardTracing" android:layout_width="match_parent" - android:layout_height="wrap_content"> + android:layout_height="wrap_content" + android:focusable="true"> <androidx.constraintlayout.widget.ConstraintLayout android:id="@+id/tracing_status_card_header" @@ -48,10 +51,12 @@ <TextView android:id="@+id/tracing_status_card_header_headline" style="@style/headline6" + android:accessibilityHeading="true" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginEnd="@dimen/spacing_small" android:text="@{headline}" + android:contentDescription="@{headline}" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toStartOf="@+id/tracing_status_card_header_icon" app:layout_constraintStart_toStartOf="parent" @@ -62,6 +67,7 @@ android:layout_width="@dimen/icon_size_main_card_end" android:layout_height="@dimen/icon_size_main_card_end" android:importantForAccessibility="no" + android:focusable="false" android:src="@{icon}" android:visibility="@{FormatterHelper.formatVisibilityIcon(icon)}" app:layout_constraintEnd_toEndOf="parent" diff --git a/Corona-Warn-App/src/main/res/layout/view_bullet_point_entry.xml b/Corona-Warn-App/src/main/res/layout/view_bullet_point_entry.xml index ffdcf0ce6a0c7c2ee426a887e5bd06a677d9b5cd..122002ebd47f2967d93de22ad81f942a7b2acb3f 100644 --- a/Corona-Warn-App/src/main/res/layout/view_bullet_point_entry.xml +++ b/Corona-Warn-App/src/main/res/layout/view_bullet_point_entry.xml @@ -13,6 +13,7 @@ android:layout_marginStart="@dimen/bullet_point_spacing_before" android:baseline="@dimen/bullet_point_baseline_offset" android:src="@drawable/bullet_point" + android:importantForAccessibility="no" app:layout_constraintBaseline_toBaselineOf="@+id/bullet_point_content" app:layout_constraintStart_toStartOf="parent" /> diff --git a/Corona-Warn-App/src/main/res/layout/view_circle_progress.xml b/Corona-Warn-App/src/main/res/layout/view_circle_progress.xml index bad4a5a8fb9a1071bfdc0f3732bac0eca09dd405..4858e8c18c740c96868177f5dcfc85e4f9854f7e 100644 --- a/Corona-Warn-App/src/main/res/layout/view_circle_progress.xml +++ b/Corona-Warn-App/src/main/res/layout/view_circle_progress.xml @@ -11,6 +11,7 @@ style="@style/body2Medium" android:layout_width="wrap_content" android:layout_height="wrap_content" + android:importantForAccessibility="no" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" @@ -20,7 +21,7 @@ android:id="@+id/circle_progress_icon" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:contentDescription="Sie haben alle tage erfasst" + android:importantForAccessibility="no" android:src="@drawable/ic_risk_card_saved_days" android:tint="@color/colorAccentTintIcon" app:layout_constraintBottom_toBottomOf="parent" diff --git a/Corona-Warn-App/src/main/res/layout/view_step_entry.xml b/Corona-Warn-App/src/main/res/layout/view_step_entry.xml index ee490f1cbdd737c30333923efa14efdaa45d5bea..d44360dd792ff6121dc36a5332878277ad6ffaa0 100644 --- a/Corona-Warn-App/src/main/res/layout/view_step_entry.xml +++ b/Corona-Warn-App/src/main/res/layout/view_step_entry.xml @@ -11,6 +11,7 @@ android:id="@+id/step_entry_icon" android:layout_width="wrap_content" android:layout_height="wrap_content" + android:importantForAccessibility="no" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" tools:src="@drawable/ic_main_overview_1" /> diff --git a/Corona-Warn-App/src/main/res/layout/view_tan_input_group_4.xml b/Corona-Warn-App/src/main/res/layout/view_tan_input_group_4.xml index a6b07ef390bcef69160dd7808da471dcf0fe7692..4a9060fe94ffbed25c202348e3cc3918dea2b9da 100644 --- a/Corona-Warn-App/src/main/res/layout/view_tan_input_group_4.xml +++ b/Corona-Warn-App/src/main/res/layout/view_tan_input_group_4.xml @@ -27,6 +27,7 @@ <TextView android:id="@+id/tan_input_4" style="@style/tanInputDigit" + android:layout_marginEnd="@dimen/no_padding" tools:text="X" /> </LinearLayout> 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 31a5e09ab6b67996fec98becd93a40e66c2e3fa9..dd23faa71c8d93e70d6118da77bae6fd24a405c7 100644 --- a/Corona-Warn-App/src/main/res/values-de/strings.xml +++ b/Corona-Warn-App/src/main/res/values-de/strings.xml @@ -35,6 +35,7 @@ <string name="preference_mobile_data_allowed"><xliff:g id="preference">"preference_mobile_data_enabled"</xliff:g></string> <!-- NOTR --> <string name="preference_registration_token"><xliff:g id="preference">"preference_registration_token"</xliff:g></string> + <!-- NOTR --> <string name="preference_device_pairing_successful_time"><xliff:g id="preference">"preference_device_pairing_successful_time"</xliff:g></string> <!-- NOTR --> <string name="preference_initial_tracing_activation_time"><xliff:g id="preference">"preference_initial_tracing_activation_time"</xliff:g></string> @@ -64,6 +65,10 @@ <string name="preference_teletan"><xliff:g id="preference">"preference_teletan"</xliff:g></string> <!-- NOTR --> <string name="preference_last_three_hours_from_server"><xliff:g id="preference">"preference_last_three_hours_from_server"</xliff:g></string> + <!-- NOTR --> + <string name="preference_polling_test_result_started"><xliff:g id="preference">"preference_polling_test_result_started"</xliff:g></string> + <!-- NOTR --> + <string name="preference_test_result_notification"><xliff:g id="preference">"preference_test_result_notification"</xliff:g></string> <!-- #################################### Generics @@ -77,6 +82,8 @@ <string name="accessibility_menu">"Menü"</string> <!-- XACT: menu description for screen readers --> <string name="accessibility_close">"Schließen"</string> + <!-- XACT: menu description for screen readers --> + <string name="accessibility_logo">"Corona-Warn-App"</string> <!-- #################################### Menu @@ -128,7 +135,7 @@ <item quantity="other">"%1$s Risiko-Begegnungen"</item> </plurals> <!-- XTXT: risk card - tracing active for x out of 14 days --> - <string name="risk_card_body_saved_days">"%1$s von 14 Tagen gespeichert"</string> + <string name="risk_card_body_saved_days">"%1$s von 14 Tagen aktiv"</string> <!-- XTXT; risk card - no update done yet --> <string name="risk_card_body_not_yet_fetched">"Begegnungen wurden noch nicht überprüft."</string> <!-- XTXT: risk card - last successful update --> @@ -142,7 +149,7 @@ <!-- XBUT: risk card - activate tracing --> <string name="risk_card_button_enable_tracing">"Risiko-Ermittlung einschalten"</string> <!-- XTXT: risk card - tracing is off, user should activate to get an updated risk level --> - <string name="risk_card_body_tracing_off">"Aktivieren Sie die Risiko-Ermittlung, um Ihre heutige Risikostatus zu berechnen."</string> + <string name="risk_card_body_tracing_off">"Aktivieren Sie die Risiko-Ermittlung, um Ihren heutigen Risikostatus zu berechnen."</string> <!-- XHED: risk card - low risk headline --> <string name="risk_card_low_risk_headline">"Niedriges Risiko"</string> <!-- XHED: risk card - increased risk headline --> @@ -176,11 +183,12 @@ <!-- XHED: main, FAQ --> <string name="main_about_headline">"Häufige Fragen"</string> <!-- XTXT: main, explains faq on card --> - <string name="main_about_body">"Hier finden Sie Antworten auf häufig gestellte Fragen rund um die Corona-Warn-App."</string> + <string name="main_about_body">"Hier finden Sie Antworten auf häufig gestellte Fragen rund um die Corona-Warn-App. Sie werden auf eine externe Website weitergeleitet."</string> <!-- NOTR --> <string name="main_about_link">"https://www.bundesregierung.de/corona-warn-app-faq"</string> <!-- XACT: Opens external webpage --> - <string name="hint_external_webpage">"Häufige Fragen, hier finden Sie Antworten auf häufig gestellte Fragen rund um die Corona-Warn-App. Aufruf externer Infos im Web."</string> + <string name="hint_external_webpage">"Häufige Fragen, hier finden Sie Antworten auf häufig gestellte Fragen rund um die Corona-Warn-App. Sie werden auf eine externe Website weitergeleitet."</string> + <!-- #################################### Main - Share ###################################### --> @@ -194,7 +202,7 @@ <!-- XBUT: Share app link page button --> <string name="main_share_button">"Download-Link versenden"</string> <!-- YMSG: Message when sharing is executed --> - <string name="main_share_message">"Gemeinsam Corona bekämpfen"<xliff:g id="line_break">"\n"</xliff:g>"Ich bin dabei. Du auch?"<xliff:g id="line_break">"\n"</xliff:g><xliff:g id="link_play_store">"https://www.coronawarn.app/"</xliff:g><xliff:g id="line_break">"\n"</xliff:g></string> + <string name="main_share_message">"Gemeinsam Corona bekämpfen"<xliff:g id="line_break">"\n"</xliff:g>"Ich bin dabei. Du auch?"<xliff:g id="line_break">"\n"</xliff:g><xliff:g id="link_play_store">"https://www.corona-warn-app.de"</xliff:g><xliff:g id="line_break">"\n"</xliff:g></string> <!-- XACT: main (share) - illustraction description, explanation image --> <string name="main_share_illustration_description">"Ein Mann teilt die Corona-Warn-App mit vier anderen Personen."</string> @@ -215,7 +223,7 @@ <!-- YTXT: App overview body text about risk levels --> <string name="main_overview_body_risk">"Sind Sie innerhalb der letzten 14 Tage einer Corona-positiv getesteten Person begegnet, berechnet die App Ihr persönliches Infektionsrisiko. Als Grundlage dafür misst sie, über welche Dauer und mit welchem Abstand eine Begegnung stattfand."</string> <!-- XHED: App overview subtitle for risk level list --> - <string name="main_overview_subtitle_risk_levels">"Folgende Risikostufen können angezeigt werden:"</string> + <string name="main_overview_subtitle_risk_levels">"Folgende Risikostatus können angezeigt werden:"</string> <!-- XTXT: App overview increased risk level --> <string name="main_overview_subtitle_increased_risk">"Erhöhtes Risiko"</string> <!-- XTXT: App overview low risk level --> @@ -247,11 +255,11 @@ <!-- XHED: App overview subtitle for glossary keys --> <string name="main_overview_subtitle_glossary_keys">"Zufallscode"</string> <!-- YTXT: App overview body for glossary keys --> - <string name="main_overview_body_glossary_keys">"Die Zufallscodes sind zufällig erzeugte Zahlen- und Buchstabenkombinationen. Sie werden zwischen benachbarten Smartphones ausgetauscht. Zufallskennungen lassen sich nicht einer bestimmten Person zuordnen und werden nach 14 Tagen automatisch gelöscht. Eine Corona-positiv getestete Person kann ihre Zufallscodes der letzten bis zu 14 Tage freiwillig mit anderen CWA-Nutzern teilen."</string> + <string name="main_overview_body_glossary_keys">"Die Zufallscodes sind zufällig erzeugte Zahlen- und Buchstabenkombinationen. Sie werden zwischen benachbarten Smartphones ausgetauscht. Zufallscodes lassen sich nicht einer bestimmten Person zuordnen und werden nach 14 Tagen automatisch gelöscht. Eine Corona-positiv getestete Person kann ihre Zufallscodes der letzten bis zu 14 Tage freiwillig mit anderen CWA-Nutzern teilen."</string> <!-- XACT: main (overview) - illustraction description, explanation image --> <string name="main_overview_illustration_description">"Ein Smartphone zeigt unterschiedliche Inhalte, die von eins bis drei nummeriert sind."</string> <!-- XACT: App main page title --> - <string name="main_title">"Hauptseite der Corona-Warn App"</string> + <string name="main_title">"Hauptseite der Corona-Warn-App"</string> <!-- #################################### Risk Details @@ -264,7 +272,7 @@ <!-- XHED: risk details - multiline headline, bold, how to act correct --> <string name="risk_details_subtitle_behavior">"So verhalten Sie sich richtig"</string> <!-- XMSG: risk details - go/stay home, something like a bullet point --> - <string name="risk_details_behavior_body_stay_home">"Begeben Sie sich umgehend nach Hause bzw. bleiben Sie zu Hause."</string> + <string name="risk_details_behavior_body_stay_home">"Begeben Sie sich, wenn möglich, nach Hause bzw. bleiben Sie zu Hause."</string> <!-- XMSG: risk details - get in touch with the corresponding people, something like a bullet point --> <string name="risk_details_behavior_body_contact_doctor">"Für Fragen zu auftretenden Symptomen, Testmöglichkeiten und weiteren Isolationsmaßnahmen, wenden Sie sich bitte an eine der folgenden Stellen:"</string> <!-- XMSG: risk details - wash your hands, something like a bullet point --> @@ -276,9 +284,9 @@ <!-- XMSG: risk details - cough/sneeze, something like a bullet point --> <string name="risk_details_behavior_body_cough_sneeze">"Niesen oder husten Sie in die Armbeuge oder in ein Taschentuch."</string> <!-- XMSG: risk details - contact your doctor, bullet point --> - <string name="risk_details_behavior_increased_body_1">"Ihre Hausärztin/Ihren Hausarzt"</string> + <string name="risk_details_behavior_increased_body_1">"Ihre Hausarztpraxis"</string> <!-- XMSG: risk details - panel doctor on-call service, bullet point --> - <string name="risk_details_behavior_increased_body_2">"Den kassenärztlichen Notdienst unter der Telefonnummer: 116117"</string> + <string name="risk_details_behavior_increased_body_2">"Den kassenärztlichen Bereitschaftsdienst unter der Telefonnummer: 116117"</string> <!-- XMSG: risk details - public health department, bullet point --> <string name="risk_details_behavior_increased_body_3">"Ihr Gesundheitsamt"</string> <!-- XHED: risk details - infection risk headline, below behaviors --> @@ -336,7 +344,7 @@ <!-- XACT: onboarding(together) - illustraction description, header image --> <string name="onboarding_illustration_description">"Eine vielfältige Gruppe in einer Stadt benutzt Smartphones."</string> <!-- XACT: Onboarding (privacy) page title --> - <string name="onboarding_privacy_accessibility_title">"Einführung Seite 2 von 5: Datenschutz"</string> + <string name="onboarding_privacy_accessibility_title">"Einführung Seite 2 von 5. Datenschutz. Es folgt ein Langtext. Eine statische Weitertaste steht am unteren Rand des Bildschirms zur Verfügung."</string> <!-- XHED: onboarding(privacy) - title --> <string name="onboarding_privacy_headline">"Datenschutz"</string> @@ -347,7 +355,7 @@ <!-- XHED: onboarding(tracing) - how to enable tracing --> <string name="onboarding_tracing_headline">"Wie Sie die Risiko-Ermittlung ermöglichen"</string> <!-- XHED: onboarding(tracing) - two/three line headline under an illustration --> - <string name="onboarding_tracing_subtitle">"Um zu erkennen, ob für Sie ein Ansteckungsrisiko vorliegt, müssen Sie die Risiko-Ermittlung aktivieren."</string> + <string name="onboarding_tracing_subtitle">"Um zu erkennen, ob für Sie ein Infektionsrisiko vorliegt, müssen Sie die Risiko-Ermittlung aktivieren."</string> <!-- YTXT: onboarding(tracing) - explain tracing --> <string name="onboarding_tracing_body">"Die Risiko-Ermittlung funktioniert, indem Ihr Handy per Bluetooth verschlüsselte Zufallscodes anderer Nutzerinnen und Nutzer empfängt und Ihren eigenen Zufallscode an deren Smartphones weitergibt. Die Funktion lässt sich jederzeit wieder deaktivieren."</string> <!-- YTXT: onboarding(tracing) - explain tracing --> @@ -410,7 +418,7 @@ <!-- XTXT: settings(tracing) - shows status under header in home, inactive --> <string name="settings_tracing_body_inactive">"Risiko-Ermittlung gestoppt"</string> <!-- YTXT: settings(tracing) - explains tracings --> - <string name="settings_tracing_body_text">"Um zu erkennen, ob für Sie ein Ansteckungsrisiko vorliegt, müssen Sie die Risiko-Ermittlung aktivieren. Die Risiko-Ermittlung funktioniert, indem Ihr Handy per Bluetooth verschlüsselte Zufallscodes anderer Nutzerinnen und Nutzer empfängt und Ihren eigenen Zufallscode an deren Smartphones weitergibt. Die Funktion lässt sich jederzeit wieder deaktivieren."<xliff:g id="line_break">"\n"</xliff:g><xliff:g id="line_break">"\n"</xliff:g>"Die verschlüsselten Zufallscodes geben nur Auskunft über das Datum, die Dauer und die anhand der Signalstärke berechnete Entfernung zu Ihren Mitmenschen. Persönliche Daten wie Name, Adresse oder Aufenthaltsort werden zu keiner Zeit erfasst. Konkrete Rückschlüsse auf Personen sind nicht möglich."</string> + <string name="settings_tracing_body_text">"Um zu erkennen, ob für Sie ein Infektionsrisiko vorliegt, müssen Sie die Risiko-Ermittlung aktivieren. Die Risiko-Ermittlung funktioniert, indem Ihr Handy per Bluetooth verschlüsselte Zufallscodes anderer Nutzerinnen und Nutzer empfängt und Ihren eigenen Zufallscode an deren Smartphones weitergibt. Die Funktion lässt sich jederzeit wieder deaktivieren."<xliff:g id="line_break">"\n"</xliff:g><xliff:g id="line_break">"\n"</xliff:g>"Die verschlüsselten Zufallscodes geben nur Auskunft über das Datum, die Dauer und die anhand der Signalstärke berechnete Entfernung zu Ihren Mitmenschen. Persönliche Daten wie Name, Adresse oder Aufenthaltsort werden zu keiner Zeit erfasst. Konkrete Rückschlüsse auf Personen sind nicht möglich."</string> <!-- XTXT: settings(tracing) - status next to switch under title --> <string name="settings_tracing_status_active">"Aktiv"</string> <!-- XTXT: settings(tracing) - status next to switch under title --> @@ -455,9 +463,12 @@ <string name="settings_notifications_headline_inactive">"Mitteilungen sind deaktiviert"</string> <!-- XTXT: settings(notification) - text in row on settings overview --> <string name="settings_notifications_body_description">"Erlauben Sie automatische Benachrichtigungen zu COVID-19-Risikostatus."</string> + <!-- YTXT: settings(notification) - description text when it notifications are enabled --> <string name="settings_notifications_body_active">"Legen Sie fest, zu welchen Themen Sie informiert bleiben möchten."</string> <!-- XTXT: settings(notification) - explains what the user has to do to activate settings --> <string name="settings_notifications_body_inactive">"Um Mitteilungen zu aktivieren, müssen Sie Mitteilungen für die Corona-Warn-App in Ihren Telefoneinstellungen zulassen."</string> + <!-- XHED: settings(notification) - card headline --> + <string name="settings_notifications_headline_card">"Mitteilungen aktivieren"</string> <!-- XHED: settings - notification headline on settings overview --> <string name="settings_notifications_subtitle_notification">"Mitteilungen"</string> <!-- XTXT: settings(notification) - next to a switch --> @@ -488,7 +499,14 @@ <string name="settings_reset_button_negative">"Abbrechen"</string> <!-- XACT: main (overview) - illustraction description, explanation image --> <string name="settings_reset_illustration_description">"Eine Hand hält ein Smartphone, auf dem das Zurücksetzen der Anwendung symbolisiert wird."</string> - + <!-- XHED: settings(reset) - dialog headline --> + <string name="settings_reset_dialog_headline">"Anwendung zurücksetzen"</string> + <!-- XTXT: settings(reset) - dialog content --> + <string name="settings_reset_dialog_body">"Sie werden nicht mehr über Ihre Risiko-Begegnungen informiert und können andere Nutzerinnen und Nutzer nicht mehr warnen. Dieser Vorgang kann nicht rückgängig gemacht werden."</string> + <!-- XBUT: settings(reset) - dialog cancel --> + <string name="settings_reset_dialog_button_cancel">"Abbrechen"</string> + <!-- XBUT: settings(reset) - dialog confirm --> + <string name="settings_reset_dialog_button_confirm">"Zurücksetzen"</string> <!-- #################################### App Information @@ -505,7 +523,7 @@ <!-- YTXT: Body text for about information page --> <string name="information_about_body_emphasized">"Das Robert Koch-Institut (RKI) als zentrale Einrichtung des Bundes im Bereich der Öffentlichen Gesundheit und als nationales Public-Health-Institut veröffentlicht die Corona-Warn-App für die gesamte Bundesregierung. Die App ist die digitale Ergänzung zu Abstandhalten, Hygiene und Alltagsmaske."</string> <!-- YTXT: Body text for about information page --> - <string name="information_about_body">"Wer sie nutzt, hilft, Infektionsketten schnell nachzuverfolgen und zu durchbrechen. Die App speichert dezentral – auf Ihrem Smartphone – Begegnungen mit anderen. Sie werden informiert, wenn Sie Kontakt mit nachweislich infizierten Personen hatten. Ihre Privatsphäre bleibt dabei bestens geschützt."</string> + <string name="information_about_body">"Wer sie nutzt, hilft, Infektionsketten schnell nachzuverfolgen und zu durchbrechen. Die App speichert dezentral – auf Ihrem Smartphone – Begegnungen mit anderen. Sie werden informiert, wenn Sie Begegnungen mit nachweislich infizierten Personen hatten. Ihre Privatsphäre bleibt dabei bestens geschützt."</string> <!-- XACT: describes illustration --> <string name="information_about_illustration_description">"Eine vielfältige Gruppe in einer Stadt benutzt Smartphones."</string> <!-- XHED: Page title for privacy information page, also menu item / button text --> @@ -531,19 +549,21 @@ <!-- XHED: Subtitle for technical contact and hotline information page --> <string name="information_contact_subtitle_phone">"Technische Hotline:"</string> <!-- XLNK: Button / hyperlink to phone call for technical contact and hotline information page --> - <string name="information_contact_button_phone">"+49 (0)800 7540001"</string> - <!-- XBUT: CAUTION - ONLY UPDATE THE NUMBER IF NEEDED, ONLY NUMBERS AND NO SPECIAL CHARACTERS EXCEPT "+" and "space" ALLOWED IN THIS FIELD; todo phone number to be called replace in english file --> + <string name="information_contact_button_phone">"+49 800 7540001"</string> + <!-- XBUT: CAUTION - ONLY UPDATE THE NUMBER IF NEEDED, ONLY NUMBERS AND NO SPECIAL CHARACTERS EXCEPT "+" and "space" ALLOWED IN THIS FIELD; --> <string name="information_contact_phone_call_number">"+49 800 7540001"</string> <!-- XTXT: Body text for technical contact and hotline information page --> <string name="information_contact_body_phone">"Unser Kundenservice ist für Sie da."</string> <!-- YTXT: Body text for technical contact and hotline information page --> - <string name="information_contact_body_open">"Unsere Öffnungszeiten:"<xliff:g id="line_break">"\n"</xliff:g>"Mo – Fr: 08:00 – 22:00 Uhr"<xliff:g id="line_break">"\n"</xliff:g>"Sa – So: 10:00 – 22:00 Uhr"<xliff:g id="line_break">"\n"</xliff:g>"Es gelten die Preise Ihres Telefonanbieters."</string> + <string name="information_contact_body_open">"Sprachen: Deutsch, Englisch \nErreichbarkeit:"<xliff:g id="line_break">"\n"</xliff:g>"Mo - Sa: 07:00 - 22:00 Uhr"<xliff:g id="line_break">"\n(außer an bundesweiten Feiertagen)"</xliff:g><xliff:g id="line_break">"\nDer Anruf ist kostenfrei."</xliff:g></string> <!-- YTXT: Body text for technical contact and hotline information page --> <string name="information_contact_body_other">"Für gesundheitliche Fragen wenden Sie sich bitte an Ihre Hausarztpraxis oder die Hotline des ärztlichen Bereitschaftsdienstes 116 117."</string> <!-- XACT: describes illustration --> <string name="information_contact_illustration_description">"Ein Mann nutzt ein Headset zum Telefonieren."</string> <!-- XLNK: Menu item / hyper link / button text for navigation to FAQ website --> <string name="information_help_title">"Häufige Fragen"</string> + <!-- XACT: accessibility hint --> + <string name="information_help_title_accessibility">"Häufige Fragen. Aufruf externer Infos im Web"</string> <!-- XHED: Page title for technical information page, also menu item / button text --> <string name="information_technical_title">"Rechtliche Hinweise"</string> <!-- XACT: describes illustration --> @@ -561,7 +581,7 @@ <!-- XHED: Headline for legal information page, contact section --> <string name="information_legal_headline_contact">"Kontakt"</string> <!-- YTXT: subtitle for legal information page, contact section --> - <string name="information_legal_subtitle_contact">"E-Mail: CoronaWarnApp@rki.de"<xliff:g id="line_break">"\n"</xliff:g>"Telefon: 030 18754 - 5100"</string> + <string name="information_legal_subtitle_contact">"E-Mail: CoronaWarnApp@rki.de"<xliff:g id="line_break">"\n"</xliff:g>"Telefon: +49 30 18754 5100"</string> <!-- XHED: Headline for legal information page, tax section --> <string name="information_legal_headline_taxid">"Umsatzsteueridentifikationsnummer"</string> <!-- YTXT: subtitle for legal information page, tax section --> @@ -614,8 +634,15 @@ <!-- XBUT: Dialog(QR Scan permission rationale) - negative button (left) --> <string name="submission_qr_code_scan_permission_rationale_dialog_button_negative">"Nicht erlauben"</string> - <!-- QR Code Scan Invalid Dialog --> + <!-- Permission Denied Dialog --> + <!-- XHED: Dialog headline QR Scan permission denied --> + <string name="submission_qr_code_scan_permission_denied_dialog_headline">"Kamerazugriff benötigt"</string> + <!-- YTXT: Dialog Body text for QR Scan permission denied --> + <string name="submission_qr_code_scan_permission_denied_dialog_body">"Bitte gehen Sie in die Systemeinstellungen und erlauben Sie der App die Benutzung der Kamera, um den QR-Code zu scannen."</string> + <!-- XBUT: Dialog(QR Scan permission denied) - button --> + <string name="submission_qr_code_scan_permission_denied_dialog_button">"OK"</string> + <!-- QR Code Scan Invalid Dialog --> <!-- XHED: Dialog headline for invalid QR code --> <string name="submission_qr_code_scan_invalid_dialog_headline">"QR-Code nicht korrekt"</string> <!-- YTXT: Dialog Body text for invalid QR code --> @@ -626,12 +653,13 @@ <string name="submission_qr_code_scan_invalid_dialog_button_negative">"Abbrechen"</string> <!-- QR Code Scan Screen --> + <string name="submission_qr_code_scan_title">"Positionieren Sie den QR-Code in den Rahmen."</string> <!-- YTXT: instruction text for QR code scanning --> <string name="submission_qr_code_scan_body">"Positionieren Sie den QR-Code in den Rahmen."</string> <!-- Submission Test Result --> <!-- XHED: Page headline for test result --> - <string name="submission_test_result_headline">"Test-Ergebnis"</string> + <string name="submission_test_result_headline">"Testergebnis"</string> <!-- XHED: Page subheadline for test result --> <string name="submission_test_result_subtitle">"Info zum Ablauf:"</string> <!-- XHED: Page headline for results next steps --> @@ -639,23 +667,23 @@ <!-- YTXT: Body text for for results next steps --> <string name="submission_test_result_steps_added_body">"Ihr Test wurde in der Corona-Warn-App registriert."</string> <!-- XHED: Page headline for pending test result next steps --> - <string name="submission_test_result_pending_steps_waiting_heading">"Test-Ergebnis noch nicht verfügbar"</string> + <string name="submission_test_result_pending_steps_waiting_heading">"Testergebnis noch nicht verfügbar"</string> <!-- YTXT: Body text for next steps section of waiting test result page --> - <string name="submission_test_result_pending_steps_waiting_body">"Ihr Test-Ergebnis steht noch nicht zur Verfügung."</string> + <string name="submission_test_result_pending_steps_waiting_body">"Ihr Testergebnis steht noch nicht zur Verfügung."</string> <!-- XBUT: test result pending : refresh button --> <string name="submission_test_result_pending_refresh_button">"Aktualisieren"</string> <!-- XBUT: test result pending : remove the test button --> <string name="submission_test_result_pending_remove_test_button">"Test entfernen"</string> <!-- XHED: Page headline for negative test result next steps --> - <string name="submission_test_result_negative_steps_negative_heading">"Ihr Test-Ergebnis"</string> + <string name="submission_test_result_negative_steps_negative_heading">"Ihr Testergebnis"</string> <!-- YTXT: Body text for next steps section of test negative result --> <string name="submission_test_result_negative_steps_negative_body">"Der Labortest hat keinen Nachweis für das Coronavirus SARS-CoV-2 bei Ihnen ergeben. \n\nBitte entfernen Sie den Test wieder aus der Corona-Warn-App, damit Sie bei Bedarf einen neuen Test hinterlegen können."</string> <!-- XBUT: negative test result : remove the test button --> <string name="submission_test_result_negative_remove_test_button">"Test entfernen"</string> <!-- XHED: Page headline for positive test result screen --> - <string name="submission_test_result_positive_steps_positive_heading">"Ihr Test-Ergebnis"</string> + <string name="submission_test_result_positive_steps_positive_heading">"Ihr Testergebnis"</string> <!-- YTXT: Body text for next steps section of test positive result--> - <string name="submission_test_result_positive_steps_positive_body">"Ihr Test-Ergebnis wurde als “positiv†verifiziert."</string> + <string name="submission_test_result_positive_steps_positive_body">"Ihr Testergebnis wurde als positiv verifiziert."</string> <!-- XHED: Page headline for other warnings screen --> <string name="submission_test_result_positive_steps_warning_others_heading">"Andere warnen"</string> <!-- YTXT: Body text for for other warnings screen--> @@ -663,7 +691,7 @@ <!-- XBUT: positive test result : continue button --> <string name="submission_test_result_positive_continue_button">"Weiter"</string> <!-- XHED: Page headline for invalid test result screen --> - <string name="submission_test_result_invalid_steps_invalid_heading">"Ihr Test-Ergebnis"</string> + <string name="submission_test_result_invalid_steps_invalid_heading">"Ihr Testergebnis"</string> <!-- YTXT: Body text for next steps section of invalid test result--> <string name="submission_test_result_invalid_steps_invalid_body">"Es gab ein Problem bei der Auswertung Ihres Tests. Bitte kontaktieren Sie das Gesundheitsamt um Information zum weiteren Vorgehen zu erhalten.\n\nBitte entfernen Sie den Test wieder aus der Corona-Warn-App, damit Sie bei Bedarf einen neuen Test hinterlegen können."</string> <!-- XBUT: invalid test result : remove the test button --> @@ -691,7 +719,7 @@ <!-- XHED: Page title for TAN submission pge --> <string name="submission_tan_title">"TAN-Eingabe"</string> <!-- YTXT: Body text for the tan submission page --> - <string name="submission_tan_body">"Geben Sie bitte die 10 Stellen der TAN ein, die Ihnen mitgeteilt wurde."</string> + <string name="submission_tan_body">"Geben Sie bitte die 10-stellige TAN ein, die Ihnen mitgeteilt wurde."</string> <!-- XBUT: Submit TAN button --> <string name="submission_tan_button_text">"Weiter"</string> <!-- XACT: Submission Tan page title --> @@ -707,7 +735,7 @@ <!-- XHED: Page headline for menu the at start of the submission process --> <string name="submission_intro_headline">"So funktioniert das Corona-Warn-System"</string> <!-- YTXT: submission introduction text --> - <string name="submission_intro_text">"Damit die Corona-Warn-App funktioniert, sind wir auf die Mithilfe von Corona-positiven Personen angewiesen.\n\nDa nur verschlüsselte Zufallscodes ausgetauscht werden, bleiben Sie unerkannt. Sie können jetzt wie folgt vorgehen:\n"</string> + <string name="submission_intro_text">"Damit die Corona-Warn-App funktioniert, sind wir auf die Mithilfe von Corona-positiv getesteten Personen angewiesen.\n\nDa nur verschlüsselte Zufallscodes ausgetauscht werden, bleiben Sie unerkannt. Sie können jetzt wie folgt vorgehen:"</string> <!-- XBUT: Submission introduction next button--> <string name="submission_intro_button_next">"Weiter"</string> <!-- XACT: Submission intro - illustration description, explanation image --> @@ -732,6 +760,7 @@ <string name="submission_dispatcher_qr_card_text">"Registrieren Sie Ihren Test, indem Sie den QR-Code ihres Test-Dokuments scannen."</string> <!-- XHED: Dialog headline for dispatcher QR prviacy dialog --> <string name="submission_dispatcher_qr_privacy_dialog_headline">"Einwilligungserklärung"</string> + <!-- YTXT: Dialog Body text for dispatcher QR privacy dialog --> <string name="submission_dispatcher_qr_privacy_dialog_body">"Durch Antippen von „Erlauben“ willigen Sie ein, dass die App den Status Ihres Corona-Virus-Tests abfragen und in der App anzeigen darf. Diese Funktion steht Ihnen zur Verfügung, wenn Sie einen QR-Code erhalten und eingewilligt haben, dass Ihr Testergebnis an das Serversystem der App übermittelt werden darf. Sobald das Testlabor Ihr Testergebnis auf dem Server hinterlegt hat, können Sie das Ergebnis in der App sehen. Falls Sie Mitteilungen aktiviert haben, werden Sie auch außerhalb der App über den Eingang des Testergebnis informiert. Das Testergebnis selbst wird aus Datenschutzgründen jedoch nur in der App angezeigt. Sie können diese Einwilligung jederzeit widerrufen, indem Sie die Testregistrierung in der App löschen. Durch den Widerruf der Einwilligung wird die Rechtmäßigkeit der bis zum Widerruf erfolgten Verarbeitung nicht berührt. Weitere Informationen finden Sie unter dem Menüpunkt „Datenschutzinformation“."</string> <!-- XBUT: submission(dispatcher QR Dialog) - positive button (right) --> <string name="submission_dispatcher_qr_privacy_dialog_button_positive">"Erlauben"</string> @@ -769,7 +798,7 @@ <!-- XHED: Page title for completed submission page --> <string name="submission_done_title">"Vielen Dank!"</string> <!-- YTXT: Body text for completed submission page --> - <string name="submission_done_body">"Sie haben einen wichtigen Beitrag geleistet! Dank Ihrer Mithilfe können Andere gewarnt werden und entsprechend reagieren."</string> + <string name="submission_done_body">"Sie haben einen wichtigen Beitrag geleistet! Dank Ihrer Mithilfe können andere gewarnt werden und entsprechend reagieren."</string> <!-- XHED: Page subtitle for completed submission page --> <string name="submission_done_subtitle">"Bitte beachten Sie:"</string> <!-- YTXT: text after submission: contagious --> @@ -804,18 +833,18 @@ <!-- YTXT: Body text for step 1 of contact page --> <string name="submission_contact_step_1_body">"Hotline anrufen & TAN erfragen:"</string> <!-- XLNK: Button / hyperlink to phone call for TAN contact page --> - <string name="submission_contact_number_display">"+49 (0)800 7540002"</string> - <!-- NOTR --> + <string name="submission_contact_number_display">"+49 800 7540002"</string> + <!-- XLNK: Technical number which is called when the user clicks on the display number --> <string name="submission_contact_number_dial">"+49 800 7540002"</string> <!-- YTXT: Body text for step 2 of contact page--> <string name="submission_contact_step_2_body">"Test per TAN-Eingabe in der App registrieren"</string> <!-- YTXT: Body text for operating hours in contact page--> - <string name="submission_contact_operating_hours_body">"Unsere Öffnungszeiten:\nMo - Fr: 08:00 - 22:00 Uhr\nSa - So: 10:00 - 22:00 Uhr\nEs gelten die Preise Ihres Telefonanbieters."</string> + <string name="submission_contact_operating_hours_body">"Sprachen: Deutsch, Englisch, Türkisch \nErreichbarkeit:\nMo - Fr: 08:00 - 22:00 Uhr\nSa - So: 10:00 - 22:00 Uhr\nDer Anruf ist kostenfrei."</string> <!-- XACT: Submission contact page title --> <string name="submission_contact_accessibility_title">"TAN-Anfrage per Telefonanruf"</string> - <!-- XACT: Content Description for submission contact step 1 --> - <string name="submission_contact_step_1_content">"Im ersten Schritt rufen Sie die Hotline an und erfragen Ihre TAN. Sie erreichen die Hotline unter der Rufnummer 0800 7540002. Die Öffnungszeiten sind Montag bis Freitag von 8 bis 22 Uhr sowie Samstag und Sonntag von 10 bis 22 Uhr. Es gelten die Preise ihres Telefonanbieters."</string> + <!-- XACT: Content Description for submission contact step 1, number has to sync with the display number --> + <string name="submission_contact_step_1_content">"Im ersten Schritt Hotline anrufen und TAN erfragen, unter der Rufnummer +49 800 7540002. Die Erreichbarkeit ist Montag bis Freitag von 8 bis 22 Uhr sowie Samstag und Sonntag von 10 bis 22 Uhr. Der Anruf ist kostenfrei."</string> <!-- XACT: Content Description for submission contact step 2 --> <string name="submission_contact_step_2_content">"Im zweiten Schritt registrieren Sie den Test per TAN-Eingabe in der App."</string> @@ -831,15 +860,15 @@ <!-- XHED: Page title for the various submission status: positive --> <string name="submission_status_card_title_positive">"Befund positiv"</string> <!-- XHED: Subtitle for the submission status card: invalid --> - <string name="submission_status_card_subtitle_invalid">"Befund ungültig"</string> + <string name="submission_status_card_subtitle_invalid">"Fehlerhafter Test"</string> <!-- XHED: Subtitle for the submission status card: negative --> <string name="submission_status_card_subtitle_negative">"Befund negativ"</string> <!-- YTXT: Body text for submission status: fetching --> <string name="submission_status_card_body_fetching">"Das Ergebnis wird aktualisiert"</string> <!-- YTXT: Body text for submission status: unregistered --> - <string name="submission_status_card_body_unregistered">"Helfen Sie mit, die Infektionskette zu durchbrechen und warnen Sie Andere."</string> + <string name="submission_status_card_body_unregistered">"Helfen Sie mit, die Infektionskette zu durchbrechen und informieren Sie andere."</string> <!-- YTXT: Body text for submission status: pending --> - <string name="submission_status_card_body_pending">"Die Auswertung dauert zwischen 1-3 Tagen."</string> + <string name="submission_status_card_body_pending">"Die Auswertung Ihres Tests ist noch nicht abgeschlossen."</string> <!-- YTXT: Body text for submission status: invalid --> <string name="submission_status_card_body_invalid">"Ihr Test konnte nicht ausgewertet werden."</string> <!-- YTXT: Body text for submission status: positive --> @@ -857,7 +886,7 @@ <!-- YTXT: text for contact card --> <string name="submission_status_card_positive_result_contact">"Das Gesundheitsamt wird sich in den nächsten Tagen telefonisch oder schriftlich bei Ihnen melden."</string> <!-- YTXT: text for share result card--> - <string name="submission_status_card_positive_result_share">"Teilen Sie Ihre Zufallskennungen, damit andere gewarnt werden können."</string> + <string name="submission_status_card_positive_result_share">"Teilen Sie Ihre Zufallscodes, damit andere gewarnt werden können."</string> <!-- Test Result Card --> <string name="test_result_card_headline">"Ihr Befund:"</string> @@ -877,7 +906,7 @@ <string name="test_result_card_negative_further_info_title">"Weitere Infos:"</string> <!-- YTXT: Content for further info of test result negative --> <string-array name="test_result_card_negative_further_info_bullet_points"> - <item>"Sie haben trotzdem gesundheitliche Beschwerden? Wenn Sie sich sehr krank fühlen und/oder Ihre Beschwerden sich verschlechtert haben, wenden Sie sich bitte an Ihre/-n Hausärztin/Hausarzt."</item> + <item>"Sie haben trotzdem gesundheitliche Beschwerden? Wenn Sie sich sehr krank fühlen und/oder Ihre Beschwerden sich verschlechtert haben, wenden Sie sich bitte an Ihre Hausarztpraxis."</item> <item>"Bleiben Sie bis zu Ihrer Genesung trotzdem zu Hause. Falls Sie sich durch eine andere Infektion geschwächt mit dem Coronavirus (SARS-CoV-2) infizieren, kann dies zu schwereren Krankheitsverläufen führen."</item> <item>"Gehen Sie nicht krank zur Arbeit, um andere Personen nicht zu gefährden. Falls sich Ihre Symptome verschlechtern, kann die Notwendigkeit eines weiteren SARS-CoV-2-Tests bestehen."</item> </string-array> @@ -893,6 +922,22 @@ <string name="button_share">"Teilen"</string> <!-- XACT: menu button--> <string name="button_menu">"Menü"</string> + <!-- XACT: Accessibility needs a suffix to strings, to reduce the amount of manual translations this string is appended to accessibility button strings, e.g. "Zurück Taste", "Taste" is the default used by android in german --> + <string name="suffix_button">"Taste"</string> + <!-- XACT: Accessibility needs a suffix to strings, to reduce the amount of manual translations this string is appended to accessibility content description strings for images, e.g. "Eine Gruppe von... Bild" --> + <string name="suffix_image">"Bild"</string> + + <!-- #################################### + Business Error Messages + ###################################### --> + <!-- XTXT: error dialog - detailed text if device is offline --> + <string name="errors_no_network">"Sie sind nicht mit dem Internet verbunden."</string> + <!-- XTXT: error dialog - detailed text if device has not enough device space --> + <string name="errors_not_enough_device_storage">"Sie haben nicht genug Speicherplatz."</string> + <!-- XTXT: error dialog - detailed text if there is error with Google API --> + <string name="errors_communication_with_api">"Fehler bei Kommunikation mit Google API"</string> + <!-- XTXT: error dialog - detailed text if there is an error during external navigation / external action --> + <string name="errors_external_action">"Diese Aktion ist aktuell leider nicht verfügbar. Bitte kontaktieren Sie die Hotline."</string> <!-- #################################### Generic Error Messages 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 f64783cb85028509bdb5fa724f60ebe32bc97c09..61f0ab3ff371190ec509517d85b6282d18223fb2 100644 --- a/Corona-Warn-App/src/main/res/values-en/strings.xml +++ b/Corona-Warn-App/src/main/res/values-en/strings.xml @@ -35,6 +35,7 @@ <string name="preference_mobile_data_allowed"><xliff:g id="preference">"preference_mobile_data_enabled"</xliff:g></string> <!-- NOTR --> <string name="preference_registration_token"><xliff:g id="preference">"preference_registration_token"</xliff:g></string> + <!-- NOTR --> <string name="preference_device_pairing_successful_time"><xliff:g id="preference">"preference_device_pairing_successful_time"</xliff:g></string> <!-- NOTR --> <string name="preference_initial_tracing_activation_time"><xliff:g id="preference">"preference_initial_tracing_activation_time"</xliff:g></string> @@ -64,6 +65,10 @@ <string name="preference_teletan"><xliff:g id="preference">"preference_teletan"</xliff:g></string> <!-- NOTR --> <string name="preference_last_three_hours_from_server"><xliff:g id="preference">"preference_last_three_hours_from_server"</xliff:g></string> + <!-- NOTR --> + <string name="preference_polling_test_result_started"><xliff:g id="preference">"preference_polling_test_result_started"</xliff:g></string> + <!-- NOTR --> + <string name="preference_test_result_notification"><xliff:g id="preference">"preference_test_result_notification"</xliff:g></string> <!-- #################################### Generics @@ -77,6 +82,8 @@ <string name="accessibility_menu">"Menu"</string> <!-- XACT: menu description for screen readers --> <string name="accessibility_close">"Close"</string> + <!-- XACT: menu description for screen readers --> + <string name="accessibility_logo">"Corona-Warn-App"</string> <!-- #################################### Menu @@ -128,7 +135,7 @@ <item quantity="other">"%1$s exposures"</item> </plurals> <!-- XTXT: risk card - tracing active for x out of 14 days --> - <string name="risk_card_body_saved_days">"%1$s of 14 days saved"</string> + <string name="risk_card_body_saved_days">"%1$s of days active"</string> <!-- XTXT; risk card - no update done yet --> <string name="risk_card_body_not_yet_fetched">"Encounters have not yet been checked."</string> <!-- XTXT: risk card - last successful update --> @@ -140,9 +147,9 @@ <!-- XBUT: risk card - update risk with time display --> <string name="risk_card_button_cooldown">"Update in %1$s"</string> <!-- XBUT: risk card - activate tracing --> - <string name="risk_card_button_enable_tracing">"Activate Risk Identification"</string> + <string name="risk_card_button_enable_tracing">"Activate Exposure Logging"</string> <!-- XTXT: risk card - tracing is off, user should activate to get an updated risk level --> - <string name="risk_card_body_tracing_off">"Activate risk identification to evaluate your risk level today."</string> + <string name="risk_card_body_tracing_off">"Activate exposure logging to evaluate your risk status today."</string> <!-- XHED: risk card - low risk headline --> <string name="risk_card_low_risk_headline">"Low Risk"</string> <!-- XHED: risk card - increased risk headline --> @@ -155,19 +162,19 @@ <!-- XHED: risk card - unknown risk headline --> <string name="risk_card_unknown_risk_headline">"Risk Unknown"</string> <!-- XTXT: risk card - tracing isn't active long enough, so a new risk level can't be calculated --> - <string name="risk_card_unknown_risk_body">"Since you have not activated risk identification for long enough, we could not calculate your risk of infection."</string> + <string name="risk_card_unknown_risk_body">"Since you have not activated exposure logging for long enough, we could not calculate your risk of infection."</string> <!-- XHED: risk card - tracing stopped headline, due to no possible calculation --> - <string name="risk_card_no_calculation_possible_headline">"Risk identification stopped"</string> + <string name="risk_card_no_calculation_possible_headline">"Exposure logging stopped"</string> <!-- XTXT: risk card - last successfully calculated risk level --> - <string name="risk_card_no_calculation_possible_body_saved_risk">"Last risk identification "<xliff:g id="line_break">"\n"</xliff:g>"%1$s"</string> + <string name="risk_card_no_calculation_possible_body_saved_risk">"Last exposure logging:"<xliff:g id="line_break"/>" %1$s"</string> <!-- XHED: risk card - outdated risk headline, calculation isn't possible --> - <string name="risk_card_outdated_risk_headline">"Risk identification is not possible"</string> + <string name="risk_card_outdated_risk_headline">"Exposure logging is not possible"</string> <!-- XTXT: risk card - outdated risk, calculation couldn't be updated in the last 24 hours --> - <string name="risk_card_outdated_risk_body">"Your risk identification could not be updated for more than 24 hours."</string> + <string name="risk_card_outdated_risk_body">"Your exposure logging could not be updated for more than 24 hours."</string> <!-- XHED: risk card - loading headline, update is ongoing --> <string name="risk_card_loading_headline">"Check is running..."</string> <!-- XTXT: risk card - loading, data is downloaded and will be checked, this can take several minutes --> - <string name="risk_card_loading_body">"Current data is beinfgdownloaded and checked. This can take several minutes."</string> + <string name="risk_card_loading_body">"Current data is being downloaded and checked.\nThis can take several minutes."</string> <!-- #################################### Main @@ -176,11 +183,12 @@ <!-- XHED: main, FAQ --> <string name="main_about_headline">"FAQ"</string> <!-- XTXT: main, explains faq on card --> - <string name="main_about_body">"Here you can find answers to frequently asked questions about the Corona-Warn-App."</string> + <string name="main_about_body">"Here you can find answers to frequently asked questions about the Corona-Warn-App. You will be forwarded to an external website."</string> <!-- NOTR --> - <string name="main_about_link">"https://www.bundesregierung.de/corona-warn-app-faq"</string> + <string name="main_about_link">"http://www.bundesregierung.de/corona-warn-app-faq-englisch"</string> <!-- XACT: Opens external webpage --> - <string name="hint_external_webpage">"Here you can find answers to frequently asked questions about the Corona-Warn-App. Link to external information on the web."</string> + <string name="hint_external_webpage">"Here you can find answers to frequently asked questions about the Corona-Warn-App. You will be forwarded to an external website."</string> + <!-- #################################### Main - Share ###################################### --> @@ -194,7 +202,7 @@ <!-- XBUT: Share app link page button --> <string name="main_share_button">"Send Download Link"</string> <!-- YMSG: Message when sharing is executed --> - <string name="main_share_message">"Fighting coronavirus together"<xliff:g id="line_break">"\n"</xliff:g>"I\'m in on this, you too?"<xliff:g id="line_break">"\n"</xliff:g><xliff:g id="link_play_store">"https://www.coronawarn.app/"</xliff:g><xliff:g id="line_break">"\n"</xliff:g></string> + <string name="main_share_message">"Fighting coronavirus together"<xliff:g id="line_break">"\n"</xliff:g>"I\'m in on this, you too?"<xliff:g id="line_break">"\n"</xliff:g><xliff:g id="link_play_store">"https://www.corona-warn-app.de"</xliff:g><xliff:g id="line_break">"\n"</xliff:g></string> <!-- XACT: main (share) - illustraction description, explanation image --> <string name="main_share_illustration_description">"One man is sharing the Corona-Warn-App with four other people."</string> @@ -207,15 +215,15 @@ <!-- XACT: main overview page title --> <string name="main_overview_accessibility_title">"Overview"</string> <!-- XHED: App overview subtitle for tracing explanation--> - <string name="main_overview_subtitle_tracing">"Risk Identification"</string> + <string name="main_overview_subtitle_tracing">"Exposure Logging"</string> <!-- YTXT: App overview body text about tracing --> - <string name="main_overview_body_tracing">"Risk identification is one of the three central features of the app. When you activate it, encounters with peoples\' devices are logged. You don\'t have to do anything else."</string> + <string name="main_overview_body_tracing">"Exposure logging is one of the three central features of the app. When you activate it, encounters with people\'s devices are logged. You don\'t have to do anything else."</string> <!-- XHED: App overview subtitle for risk explanation --> <string name="main_overview_subtitle_risk">"Risk of Infection"</string> <!-- YTXT: App overview body text about risk levels --> - <string name="main_overview_body_risk">"If you have had contact within the last 14 days with a person who was diagnosed with COVID-19, the app calculates your peronal risk of infection. It does this by measuring duration and proximity of the exposure."</string> + <string name="main_overview_body_risk">"If you have had contact within the last 14 days with a person who was diagnosed with COVID-19, the app calculates your personal risk of infection. It does this by measuring duration and proximity of the exposure."</string> <!-- XHED: App overview subtitle for risk level list --> - <string name="main_overview_subtitle_risk_levels">"The following risk levels can be shown:"</string> + <string name="main_overview_subtitle_risk_levels">"The following risk status can be shown:"</string> <!-- XTXT: App overview increased risk level --> <string name="main_overview_subtitle_increased_risk">"Higher Risk"</string> <!-- XTXT: App overview low risk level --> @@ -225,17 +233,17 @@ <!-- XHED: App overview subtitle for test procedure explanation --> <string name="main_overview_headline_test">"Notifying Other Users"</string> <!-- YTXT: App overview body text about rest procedure --> - <string name="main_overview_body_test">"Another central feature is registering your test and retrieving the result. If you are diagnosed with COVID-19, you can warn others and break the chain of infection."</string> + <string name="main_overview_body_test">"Another central feature is registering your test and retrieving the result. If you are diagnosed with COVID-19, you can notify others and break the chain of infection."</string> <!-- XHED: App overview headline for glossary --> <string name="main_overview_headline_glossary">"Definition of Terms:"</string> <!-- XHED: App overview subtitle for glossary key storage --> - <string name="main_overview_subtitle_glossary_tracing">"Exposure Logging"</string> + <string name="main_overview_subtitle_glossary_tracing">"Exposure Log"</string> <!-- YTXT: App overview body for glossary key storage --> <string name="main_overview_body_glossary_tracing">"List of received and temporary random IDs saved temporarily in the operating system storage. This list is read when the exposures are checked. All random IDs are automatically deleted after 14 days."</string> <!-- XHED: App overview subtitle for glossary risk calculation --> <string name="main_overview_subtitle_glossary_calculation">"Exposure Check"</string> <!-- YTXT: App overview body for glossary risk calculation --> - <string name="main_overview_body_glossary_calculation">"Exposure logging data is retrieved and synchronized with reported infections of other users. The exposure check is performed automatically about every two hours."</string> + <string name="main_overview_body_glossary_calculation">"Exposure log data is retrieved and synchronized with reported infections of other users. The exposure check is performed automatically about every two hours."</string> <!-- XHED: App overview subtitle for glossary contact --> <string name="main_overview_subtitle_glossary_contact">"Exposures"</string> <!-- YTXT: App overview body for glossary contact --> @@ -247,7 +255,7 @@ <!-- XHED: App overview subtitle for glossary keys --> <string name="main_overview_subtitle_glossary_keys">"Random ID"</string> <!-- YTXT: App overview body for glossary keys --> - <string name="main_overview_body_glossary_keys">"Random IDs are combinations of digits and letters generated randomly. They are exhanged between devices in close proximity. Random IDs cannot be assigned to a specific person and are automatically deleted after 14 days. People diagnosed with COVID-19 can opt to share their random IDs of up to the last 14 days with other app users."</string> + <string name="main_overview_body_glossary_keys">"Random IDs are combinations of digits and letters generated randomly. They are exchanged between devices in close proximity. Random IDs cannot be assigned to a specific person and are automatically deleted after 14 days. People diagnosed with COVID-19 can opt to share their random IDs of up to the last 14 days with other app users."</string> <!-- XACT: main (overview) - illustraction description, explanation image --> <string name="main_overview_illustration_description">"One device shows different content numbered from 1 to 3."</string> <!-- XACT: App main page title --> @@ -258,21 +266,21 @@ ###################################### --> <!-- XHED: risk details - page title, in toolbar --> - <string name="risk_details_title">"Your Risk Level"</string> + <string name="risk_details_title">"Your Risk Status"</string> <!-- XHED: risk details - headline, how a user should act --> - <string name="risk_details_headline_behavior">"Behavioral Recommendations"</string> + <string name="risk_details_headline_behavior">"Recommendations"</string> <!-- XHED: risk details - multiline headline, bold, how to act correct --> - <string name="risk_details_subtitle_behavior">"This is what you should do:"</string> + <string name="risk_details_subtitle_behavior">"This is what you should do"</string> <!-- XMSG: risk details - go/stay home, something like a bullet point --> - <string name="risk_details_behavior_body_stay_home">"Please go home as soon as you can, and stay at home."</string> + <string name="risk_details_behavior_body_stay_home">"If possible, please go home and stay at home."</string> <!-- XMSG: risk details - get in touch with the corresponding people, something like a bullet point --> - <string name="risk_details_behavior_body_contact_doctor">"If you have questions about symptoms, testing availability, or self-isolation, please contact one of the following:"</string> + <string name="risk_details_behavior_body_contact_doctor">"If you have questions about symptoms, testing possibilities, or additional isolation measures, please contact one of the following:"</string> <!-- XMSG: risk details - wash your hands, something like a bullet point --> <string name="risk_details_behavior_body_wash_hands">"Wash your hands regularly."</string> <!-- XMSG: risk details - wear a face mask, something like a bullet point --> <string name="risk_details_behavior_body_wear_mask">"Wear a face mask when you encounter other people."</string> <!-- XMSG: risk details - stay 1,5 away, something like a bullet point --> - <string name="risk_details_behavior_body_stay_away">"Keep at least 1.5 metres distance from other people."</string> + <string name="risk_details_behavior_body_stay_away">"Keep at least 1.5 meters distance from other people."</string> <!-- XMSG: risk details - cough/sneeze, something like a bullet point --> <string name="risk_details_behavior_body_cough_sneeze">"Sneeze or cough into your elbow or a tissue."</string> <!-- XMSG: risk details - contact your doctor, bullet point --> @@ -284,13 +292,13 @@ <!-- XHED: risk details - infection risk headline, below behaviors --> <string name="risk_details_headline_infection_risk">"Risk of Infection"</string> <!-- XHED: risk details - how your risk level was calculated, below behaviors --> - <string name="risk_details_subtitle_infection_risk_past">"This is how your risk level was calculated"</string> + <string name="risk_details_subtitle_infection_risk_past">"This is how your risk was calculated"</string> <!-- XHED: risk details - how your risk level will be calculated, below behaviors --> - <string name="risk_details_subtitle_infection_risk">"This is how your risk level is calculated"</string> + <string name="risk_details_subtitle_infection_risk">"This is how your risk is calculated"</string> <!-- XMSG: risk details - risk couldn't be calculated tracing wasn't enabled long enough, below behaviors --> - <string name="risk_details_information_body_unknown_risk">"Since you have not activated risk identification for long enough, we could not calculate your risk of infection."</string> + <string name="risk_details_information_body_unknown_risk">"Since you have not activated exposure logging for long enough, we could not calculate your risk of infection."</string> <!-- XMSG: risk details - risk calculation wasn't possible for 24h, below behaviors --> - <string name="risk_details_information_body_outdated_risk">"Your risk identification could not be updated for more than 24 hours."</string> + <string name="risk_details_information_body_outdated_risk">"Your exposure logging could not be updated for more than 24 hours."</string> <!-- YTXT: risk details - low risk explanation text --> <string name="risk_details_information_body_low_risk">"You have a low risk of infection because no exposure to people later diagnosed with COVID-19 was logged, or because your encounters were only for a short time and at a greater distance."</string> <!-- YTXT: risk details - increased risk explanation text with variable for day(s) since last contact --> @@ -299,13 +307,13 @@ <item quantity="other">"You have a higher risk of infection because you were last exposed %1$s days ago over a longer period of time and in close proximity to at least one person diagnosed with COVID-19."</item> </plurals> <!-- YTXT: risk details - risk calculation explanation --> - <string name="risk_details_information_body_notice">"Your risk of infection is calculated from the risk identification data (duration and proximity) locally on your device. Your risk of infection cannot be seen by, or passed on to, anyone else."</string> + <string name="risk_details_information_body_notice">"Your risk of infection is calculated from the exposure logging data (duration and proximity) locally on your device. Your risk of infection cannot be seen by, or passed on to, anyone else."</string> <!-- NOTR --> <string name="risk_details_button_update">@string/risk_card_button_update</string> <!-- NOTR --> <string name="risk_details_button_enable_tracing">@string/risk_card_button_enable_tracing</string> <!-- XACT: risk details page title --> - <string name="risk_details_accessibility_title">"Your Risk Level"</string> + <string name="risk_details_accessibility_title">"Your Risk Status"</string> <!-- #################################### Onboarding @@ -336,28 +344,28 @@ <!-- XACT: onboarding(together) - illustraction description, header image --> <string name="onboarding_illustration_description">"A group of people are all using their devices in town."</string> <!-- XACT: Onboarding (privacy) page title --> - <string name="onboarding_privacy_accessibility_title">"Onboarding page 2 of 5: Data Privacy"</string> + <string name="onboarding_privacy_accessibility_title">"Onboarding page 2 of 5: Data Privacy. A long text follows. To proceed at any time, use the button at the bottom of the screen."</string> <!-- XHED: onboarding(privacy) - title --> <string name="onboarding_privacy_headline">"Data Privacy"</string> <!-- XACT: onboarding(privacy) - illustraction description, header image --> <string name="onboarding_privacy_illustration_description">"One of the women is using the Corona-Warn-App on her device. The padlock on the shield is the symbol for encrypted data."</string> <!-- XACT: Onboarding (tracing) page title --> - <string name="onboarding_tracing_accessibility_title">"Onboarding page 3 of 5: How to Enable Risk Identification"</string> + <string name="onboarding_tracing_accessibility_title">"Onboarding page 3 of 5: How to Enable Exposure Logging"</string> <!-- XHED: onboarding(tracing) - how to enable tracing --> - <string name="onboarding_tracing_headline">"How to Enable Risk Identification"</string> + <string name="onboarding_tracing_headline">"How to Enable Exposure Logging"</string> <!-- XHED: onboarding(tracing) - two/three line headline under an illustration --> - <string name="onboarding_tracing_subtitle">"To identify whether you are at risk of infection, you have to activate the risk identification feature."</string> + <string name="onboarding_tracing_subtitle">"To identify whether you are at risk of infection, you must activate the exposure logging feature."</string> <!-- YTXT: onboarding(tracing) - explain tracing --> - <string name="onboarding_tracing_body">"Risk identification works by your device receiving, via Bluetooth, encrypted random IDs of other users and passing your own random ID to their devices. This feature can be deactivated at any time."</string> + <string name="onboarding_tracing_body">"Exposure logging works by your device receiving, via Bluetooth, encrypted random IDs of other users and passing your own random ID to their devices. This feature can be deactivated at any time."</string> <!-- YTXT: onboarding(tracing) - explain tracing --> <string name="onboarding_tracing_body_emphasized">"The encrypted random IDs only pass information about date, duration and proximity (using signal strength) to other people. Personal data such as name, address, location is never recorded. Individuals cannot be identified."</string> <!-- XHED: onboarding(tracing) - headline for consent information --> <string name="onboarding_tracing_headline_consent">"Declaration of Consent"</string> <!-- YTXT: onboarding(tracing) - body for consent information --> - <string name="onboarding_tracing_body_consent">"<Translation to be added>"</string> + <string name="onboarding_tracing_body_consent">"To find out whether you have been in contact with an infected person and whether there is a risk that you yourself have been infected, you need to enable the App’s exposure logging feature. By tapping on the “Enable†button, you agree to the enabling of the App’s exposure logging feature and the associated data processing."<xliff:g id="line_break">"\n"</xliff:g><xliff:g id="line_break">"\n"</xliff:g>"In order to use the App’s exposure logging feature, you will have to enable the COVID-19 Exposure Logging functionality provided by Google on your smartphone and grant the Corona-Warn-App permission to use this."<xliff:g id="line_break">"\n"</xliff:g><xliff:g id="line_break">"\n"</xliff:g>"When exposure logging is enabled, your smartphone continuously generates and transmits random IDs via Bluetooth, which other Android or Apple smartphones in your vicinity can receive if exposure logging is also enabled on them. Your smartphone, in turn, receives the random IDs of the other smartphones. Your own random IDs and those received from other smartphones are recorded in the exposure log and stored there for 14 days."<xliff:g id="line_break">"\n"</xliff:g><xliff:g id="line_break">"\n"</xliff:g>"To identify your risk of infection, the App loads a list – several times a day or on request – of the random IDs of all users who have told the App that they have been infected with the coronavirus. This list is then compared with the random IDs stored in the exposure log. If the App detects that you may have been in contact with an infected user, it will inform you of this and tell you that there is a risk that you are also infected. In this case, the App is also given access to other data stored in your smartphone’s exposure log (date, duration and Bluetooth signal strength of the contact)."<xliff:g id="line_break">"\n"</xliff:g><xliff:g id="line_break">"\n"</xliff:g>"The Bluetooth signal strength is used to derive the physical distance (the stronger the signal, the smaller the distance). The App then analyses this information in order to assess your likelihood of having been infected with the coronavirus and to give you recommendations for what to do next. This analysis is only performed locally on your smartphone. Apart from you, nobody (not even the RKI) will know whether you have been in contact with an infected person and what risk has been identified for you."<xliff:g id="line_break">"\n"</xliff:g><xliff:g id="line_break">"\n"</xliff:g>"To withdraw your consent to the exposure logging feature, you can disable the feature using the toggle switch in the App or delete the App. If you decide to use the exposure logging feature again, you can toggle the feature back on or reinstall the App. If you disable the exposure logging feature, the App will no longer check whether you have been in contact with an infected user. If you also wish to stop your device sending and receiving random IDs, you will need to disable COVID-19 Exposure Logging in your smartphone settings. Please note that your own random IDs and those received from other smartphones which are stored in the exposure log will not be deleted in the App. You can only permanently delete the data stored in the exposure log in your smartphone settings."<xliff:g id="line_break">"\n"</xliff:g><xliff:g id="line_break">"\n"</xliff:g>"The App’s privacy notice (including an explanation of the data processing carried out for the exposure logging feature) can be found in the menu under “Data Privacy Informationâ€."</string> <!-- XBUT: onboarding(tracing) - button enable tracing --> - <string name="onboarding_tracing_button_next">"Activate risk identification"</string> + <string name="onboarding_tracing_button_next">"Activate Exposure Logging"</string> <!-- XTXT: onboarding(tracing) - dialog about tracing permission declined --> <string name="onboarding_tracing_dialog_headline">"Authorization"</string> <!-- YMSI: onboarding(tracing) - dialog about tracing --> @@ -367,13 +375,13 @@ <!-- XBUT: onboarding(tracing) - negative button (right) --> <string name="onboarding_tracing_dialog_button_negative">"Back"</string> <!-- XACT: onboarding(tracing) - illustraction description, header image --> - <string name="onboarding_tracing_illustration_description">"Three people have activated risk identification on their devices, which will log their encounters with each other."</string> + <string name="onboarding_tracing_illustration_description">"Three people have activated exposure logging on their devices, which will log their encounters with each other."</string> <!-- XACT: Onboarding (test) page title --> <string name="onboarding_test_accessibility_title">"Onboarding page 4 of 5: If you are diagnosed with COVID-19..."</string> <!-- XHED: onboarding(test) - about positive tests --> <string name="onboarding_test_headline">"If you are diagnosed with COVID-19..."</string> <!-- XHED: onboarding(test) - two/three line headline under an illustration --> - <string name="onboarding_test_subtitle">"...please report this in the Corona-Warn-App. This is voluntary and secure. Please do this for the sake of everyone\'s health."</string> + <string name="onboarding_test_subtitle">"...please report this in the Corona-Warn-App. Sharing your test results is voluntary and secure. Please do this for the sake of everyone\'s health."</string> <!-- YTXT: onboarding(test) - explain test --> <string name="onboarding_test_body">"Your notification is encrypted securely and processed on a secure server. People whose encrypted random IDs your device has collected, will now receive a warning along with information about what they should now do."</string> <!-- XACT: onboarding(test) - illustraction description, header image --> @@ -400,17 +408,17 @@ <!-- XTXT: settings - off, like a label next to a setting --> <string name="settings_off">"Off"</string> <!-- XHED: settings(tracing) - page title --> - <string name="settings_tracing_title">"Risk Identification"</string> + <string name="settings_tracing_title">"Exposure Logging"</string> <!-- XHED: settings(tracing) - headline bellow illustration --> <string name="settings_tracing_headline">"This is how exposure logging works"</string> <!-- XTXT: settings(tracing) - explain text in settings overview under headline --> <string name="settings_tracing_body_description">"Allow COVID-19 random IDs to be generated and shared."</string> <!-- XTXT: settings(tracing) - shows status under header in home, active --> - <string name="settings_tracing_body_active">"Risk identification active"</string> + <string name="settings_tracing_body_active">"Exposure logging active"</string> <!-- XTXT: settings(tracing) - shows status under header in home, inactive --> - <string name="settings_tracing_body_inactive">"Risk identification stopped"</string> + <string name="settings_tracing_body_inactive">"Exposure logging stopped"</string> <!-- YTXT: settings(tracing) - explains tracings --> - <string name="settings_tracing_body_text">"Risk identification works by your device receiving, via Bluetooth, encrypted random IDs of other users and passing your random ID to their devices. This feature can be deactivated at any time. "<xliff:g id="line_break">"\n"</xliff:g><xliff:g id="line_break">"\n"</xliff:g>" Encrypted random IDs only pass information about date, duration and proximity (calculated using signal strength) to other people. Personal data such as name, address, location is never recorded. Individuals cannot be identified."</string> + <string name="settings_tracing_body_text">"Exposure logging works by your device receiving, via Bluetooth, encrypted random IDs of other users and passing your random ID to their devices. This feature can be deactivated at any time. "<xliff:g id="line_break">"\n"</xliff:g><xliff:g id="line_break">"\n"</xliff:g>"Encrypted random IDs only pass information about date, duration, and proximity (calculated using signal strength) to other people. Personal data such as name, address, and location is never recorded. Individuals cannot be identified."</string> <!-- XTXT: settings(tracing) - status next to switch under title --> <string name="settings_tracing_status_active">"Active"</string> <!-- XTXT: settings(tracing) - status next to switch under title --> @@ -424,24 +432,24 @@ <!--XHED : settings(tracing) - headline on card about the current status and what to do --> <string name="settings_tracing_status_bluetooth_headline">"Turn on Bluetooth"</string> <!-- XTXT: settings(tracing) - explains user what to do on card if bluetooth is disabled --> - <string name="settings_tracing_status_bluetooth_body">"Bluetooth must be turned on for risk identification in order to log encounters. Please turn on Bluetooth in your device settings."</string> + <string name="settings_tracing_status_bluetooth_body">"Bluetooth must be turned on for exposure logging in order to log encounters. Please turn on Bluetooth in your device settings."</string> <!-- XBUT: settings(tracing) - go to operating system settings button on card --> <string name="settings_tracing_status_bluetooth_button">"Open Device Settings"</string> <!--XHED : settings(tracing) - headline on card about the current status and what to do --> <string name="settings_tracing_status_connection_headline">"Open Internet connection"</string> <!-- XTXT: settings(tracing) - explains user what to do on card if connection is disabled --> - <string name="settings_tracing_status_connection_body">"Risk identification requires an Internet connection to calculate exposures. Please turn on wifi or mobile data in your device settings."</string> + <string name="settings_tracing_status_connection_body">"Exposure logging requires an Internet connection to calculate exposures. Please turn on WIFI or mobile data in your device settings."</string> <!-- XBUT: settings(tracing) - go to operating system settings button on card --> <string name="settings_tracing_status_connection_button">"Open Device Settings"</string> <!-- XTXT: settings(tracing) - explains the circle progress indicator to the right with the current value --> <plurals name="settings_tracing_status_body_active"> - <item quantity="one">"Risk identification has been active for one day.\nAn exposure check can only be reliable if risk identification is permanently activated."</item> - <item quantity="other">"Risk identification has been active for %1$s days.\nAn exposure check can only be reliable if risk identification is permanently activated."</item> + <item quantity="one">"Exposure logging has been active for one day.\nAn exposure check can only be reliable if exposure logging is permanently activated."</item> + <item quantity="other">"Exposure logging has been active for %1$s days.\nAn exposure check can only be reliable if exposure logging is permanently activated."</item> </plurals> <!-- XACT: settings(tracing) - describes illustration --> - <string name="settings_tracing_illustration_description_active">"Three people have activated risk identification on their devices, which will log their encounters with each other."</string> + <string name="settings_tracing_illustration_description_active">"Three people have activated exposure logging on their devices, which will log their encounters with each other."</string> <!-- XACT: settings(tracing) - describes illustration --> - <string name="settings_tracing_illustration_description_inactive">"One person has deactivated risk identification on their device, so an encounter with two other people is not logged."</string> + <string name="settings_tracing_illustration_description_inactive">"One person has deactivated exposure logging on their device, so an encounter with two other people is not logged."</string> <!-- XACT: settings(tracing) - describes illustration --> <string name="settings_tracing_bluetooth_illustration_description_inactive">"One person has turned off Bluetooth on their device, so an encounter with two other people is not logged."</string> <!-- XACT: settings(tracing) - describes illustration --> @@ -454,10 +462,13 @@ <!-- XHED: settings(notification) - multiline headline below illustration, inactive --> <string name="settings_notifications_headline_inactive">"Notifications are deactivated"</string> <!-- XTXT: settings(notification) - text in row on settings overview --> - <string name="settings_notifications_body_description">"Allow automatic notifications of COVID-19 risk level"</string> + <string name="settings_notifications_body_description">"Allow automatic notifications of COVID-19 risk status"</string> + <!-- YTXT: settings(notification) - description text when it notifications are enabled --> <string name="settings_notifications_body_active">"Specify which areas you want to continue to receive notifications for."</string> <!-- XTXT: settings(notification) - explains what the user has to do to activate settings --> - <string name="settings_notifications_body_inactive">"To activate notifications, you have to allow notifications for the Corona-Warn-App in your device settings."</string> + <string name="settings_notifications_body_inactive">"To activate notifications, you must allow notifications for the Corona-Warn-App in your device settings."</string> + <!-- XHED: settings(notification) - card headline --> + <string name="settings_notifications_headline_card">"Activate Notifications"</string> <!-- XHED: settings - notification headline on settings overview --> <string name="settings_notifications_subtitle_notification">"Notifications"</string> <!-- XTXT: settings(notification) - next to a switch --> @@ -479,16 +490,23 @@ <!-- XTXT: settings(reset) - explains the consequences --> <string name="settings_reset_body">"You will no longer be notified of your exposures and you will no longer be able to warn other users."</string> <!-- XHED: settings(reset) - on card, explains user to go to the operating system settings --> - <string name="settings_reset_headline_keys">"Delete Exposure "<xliff:g id="line_break">"\n"</xliff:g>"Loggings"</string> + <string name="settings_reset_headline_keys">"Delete Exposure "<xliff:g id="line_break">"\n"</xliff:g>"Log"</string> <!-- XTXT: settings(reset) - on card --> - <string name="settings_reset_body_keys">"Exposure logging has to be deleted separately in your device settings."</string> + <string name="settings_reset_body_keys">"The exposure log must be deleted separately in your device settings."</string> <!-- XBUT: settings(reset) - triggers reset --> <string name="settings_reset_button_positive">"Reset App"</string> <!-- XBUT: settings(reset) - cancel reset and navigates the suer back to the settings --> <string name="settings_reset_button_negative">"Cancel"</string> <!-- XACT: main (overview) - illustraction description, explanation image --> <string name="settings_reset_illustration_description">"One person is holding a device displaying a symbol indicating that the app is being reset."</string> - + <!-- XHED: settings(reset) - dialog headline --> + <string name="settings_reset_dialog_headline">"Reset App"</string> + <!-- XTXT: settings(reset) - dialog content --> + <string name="settings_reset_dialog_body">"You will no longer be notified of your exposures and you will no longer be able to warn other users. This procedure cannot be undone."</string> + <!-- XBUT: settings(reset) - dialog cancel --> + <string name="settings_reset_dialog_button_cancel">"Cancel"</string> + <!-- XBUT: settings(reset) - dialog confirm --> + <string name="settings_reset_dialog_button_confirm">"Reset"</string> <!-- #################################### App Information @@ -503,9 +521,9 @@ <!-- XHED: Subtitle for about information page --> <string name="information_about_headline">"Let\'s fight coronavirus together"</string> <!-- YTXT: Body text for about information page --> - <string name="information_about_body_emphasized">"The Robert Koch Institute (RKI) is the central body for the federal state of Germany in the field of public health. The RKI is publishing the Corona-Warn-App for the federal government. The app represents the digital extension to the public health measures already introduced: social distancing, hygiene behavior, and face masks."</string> + <string name="information_about_body_emphasized">"The Robert Koch Institute (RKI) is Germany’s central body for the Federal States of Germany in the field of public health. The RKI is publishing the Corona-Warn-App for the federal government. The app represents the digital extension to the public health measures already introduced: social distancing, hygiene behavior, and face masks."</string> <!-- YTXT: Body text for about information page --> - <string name="information_about_body">"Whoever uses the app helps to trace and break chains of infection. The app saves encounters with other people locally on your device. You are notified if you have encountered people who were later diagnosed with COVID-19. Your identity and privacy is always protected."</string> + <string name="information_about_body">"Whoever uses the app helps to trace and break chains of infection. The app saves encounters with other people locally on your device. You are notified if you have encountered people who were later diagnosed with COVID-19. Your identity and privacy are always protected."</string> <!-- XACT: describes illustration --> <string name="information_about_illustration_description">"A group of people are all using their devices in town."</string> <!-- XHED: Page title for privacy information page, also menu item / button text --> @@ -517,7 +535,7 @@ <!-- XHED: Page title for terms of use information page, also menu item / button text --> <string name="information_terms_title">"Terms of Use"</string> <!-- XHED: Page headline for terms of use information page --> - <string name="information_terms_headline">"Inhalt"</string> + <string name="information_terms_headline">"Content"</string> <!-- XACT: describes illustration --> <string name="information_terms_illustration_description">"One person is holding a device with a lot of text on the screen. Next to the text is a tick, which is the symbol for accepting the terms of use."</string> <!-- XTXT: Path to the full blown terms html, to translate it exchange "_de" to "_en" and provide the corresponding html file --> @@ -531,19 +549,21 @@ <!-- XHED: Subtitle for technical contact and hotline information page --> <string name="information_contact_subtitle_phone">"Technical hotline:"</string> <!-- XLNK: Button / hyperlink to phone call for technical contact and hotline information page --> - <string name="information_contact_button_phone">"+49 (0)800 7540001"</string> - <!-- XBUT: CAUTION - ONLY UPDATE THE NUMBER IF NEEDED, ONLY NUMBERS AND NO SPECIAL CHARACTERS EXCEPT "+" and "space" ALLOWED IN THIS FIELD; todo phone number to be called replace in english file --> + <string name="information_contact_button_phone">"+49 800 7540001"</string> + <!-- XBUT: CAUTION - ONLY UPDATE THE NUMBER IF NEEDED, ONLY NUMBERS AND NO SPECIAL CHARACTERS EXCEPT "+" and "space" ALLOWED IN THIS FIELD; --> <string name="information_contact_phone_call_number">"+49 800 7540001"</string> <!-- XTXT: Body text for technical contact and hotline information page --> <string name="information_contact_body_phone">"Our customer service is here to help."</string> <!-- YTXT: Body text for technical contact and hotline information page --> - <string name="information_contact_body_open">"Business hours:"<xliff:g id="line_break">"\n"</xliff:g>"Monday to Friday: 8am - 10pm"<xliff:g id="line_break">"\n"</xliff:g>"Saturday and Sunday: 10am - 10pm"<xliff:g id="line_break">"\n"</xliff:g>"The standard charges of your telephone provider apply."</string> + <string name="information_contact_body_open">"Languages: German, English\nBusiness hours:"<xliff:g id="line_break">"\n"</xliff:g>"Monday to Saturday: 7am - 10pm"<xliff:g id="line_break">"\n(except national holidays)"</xliff:g><xliff:g id="line_break">"\nThe call is free of charge."</xliff:g></string> <!-- YTXT: Body text for technical contact and hotline information page --> <string name="information_contact_body_other">"If you have any health-related questions, please contact your general practitioner or the hotline for the medical emergency service, telephone: +49 6251 / 708-1082, telefax: +49 116 / 78117."</string> <!-- XACT: describes illustration --> <string name="information_contact_illustration_description">"One man is wearing a headset while he is telephoning."</string> <!-- XLNK: Menu item / hyper link / button text for navigation to FAQ website --> <string name="information_help_title">"FAQ"</string> + <!-- XACT: accessibility hint --> + <string name="information_help_title_accessibility">"FAQ. Open external link."</string> <!-- XHED: Page title for technical information page, also menu item / button text --> <string name="information_technical_title">"Legal Notices"</string> <!-- XACT: describes illustration --> @@ -555,13 +575,13 @@ <!-- XHED: Headline for legal information page, publisher section --> <string name="information_legal_headline_publisher">"Published by"</string> <!-- YTXT: subtitle for legal information page, publisher section --> - <string name="information_legal_subtitle_publisher">"(responsible in accordance with § 5, Paragraph 1 TMG, § 55 Paragraph 1 RStV, DS-GVO, BDSG)"</string> + <string name="information_legal_subtitle_publisher">"(responsible according to § 5, Paragraph 1 TMG, § 55 Paragraph 1 RStV, DS-GVO, BDSG)"</string> <!-- YTXT: body for legal information page, publisher section --> - <string name="information_legal_body_publisher">"Robert Koch-Institut"<xliff:g id="line_break">"\n"</xliff:g>"Nordufer 20"<xliff:g id="line_break">"\n"</xliff:g>"13353 Berlin"<xliff:g id="line_break">"\n"</xliff:g><xliff:g id="line_break">"\n"</xliff:g>"vertreten durch den Präsidenten"</string> + <string name="information_legal_body_publisher">"Robert Koch Institute"<xliff:g id="line_break">"\n"</xliff:g>"Nordufer 20"<xliff:g id="line_break">"\n"</xliff:g>"13353 Berlin"<xliff:g id="line_break">"\n"</xliff:g><xliff:g id="line_break">"\n"</xliff:g>"vertreten durch den Präsidenten"</string> <!-- XHED: Headline for legal information page, contact section --> <string name="information_legal_headline_contact">"Contact"</string> <!-- YTXT: subtitle for legal information page, contact section --> - <string name="information_legal_subtitle_contact">"E-Mail: CoronaWarnApp@rki.de"<xliff:g id="line_break">"\n"</xliff:g>"Telefon: 030 18754 - 5100"</string> + <string name="information_legal_subtitle_contact">"E-Mail: CoronaWarnApp@rki.de"<xliff:g id="line_break">"\n"</xliff:g>"Telefon: +49 30 18754 5100"</string> <!-- XHED: Headline for legal information page, tax section --> <string name="information_legal_headline_taxid">"VAT identification number"</string> <!-- YTXT: subtitle for legal information page, tax section --> @@ -586,7 +606,7 @@ <!-- XHED: Dialog title for already paired test error --> <string name="submission_error_dialog_web_test_paired_title">"Error"</string> <!-- XMSG: Dialog body for already paired test error --> - <string name="submission_error_dialog_web_test_paired_body">"The QR code/TAN is invalid or has been used already. The TAN is invalid or has been used already. Please try again or contact the technical hotline via App Information -> Technical Hotline."</string> + <string name="submission_error_dialog_web_test_paired_body">"The QR code/TAN is invalid or has been used already. Please try again or contact the technical hotline via App Information -> Technical Hotline."</string> <!-- XBUT: Positive button for already paired test error --> <string name="submission_error_dialog_web_test_paired_button_positive">"Back"</string> @@ -614,8 +634,15 @@ <!-- XBUT: Dialog(QR Scan permission rationale) - negative button (left) --> <string name="submission_qr_code_scan_permission_rationale_dialog_button_negative">"Do Not Allow"</string> - <!-- QR Code Scan Invalid Dialog --> + <!-- Permission Denied Dialog --> + <!-- XHED: Dialog headline QR Scan permission denied --> + <string name="submission_qr_code_scan_permission_denied_dialog_headline">"Camera access needed"</string> + <!-- YTXT: Dialog Body text for QR Scan permission denied --> + <string name="submission_qr_code_scan_permission_denied_dialog_body">"Please call up the system settings and allow the app to use the camera to scan the QR code."</string> + <!-- XBUT: Dialog(QR Scan permission denied) - button --> + <string name="submission_qr_code_scan_permission_denied_dialog_button">"OK"</string> + <!-- QR Code Scan Invalid Dialog --> <!-- XHED: Dialog headline for invalid QR code --> <string name="submission_qr_code_scan_invalid_dialog_headline">"Incorrect QR code"</string> <!-- YTXT: Dialog Body text for invalid QR code --> @@ -626,20 +653,21 @@ <string name="submission_qr_code_scan_invalid_dialog_button_negative">"Cancel"</string> <!-- QR Code Scan Screen --> + <string name="submission_qr_code_scan_title">"Position the QR code in the frame."</string> <!-- YTXT: instruction text for QR code scanning --> <string name="submission_qr_code_scan_body">"Position the QR code in the frame."</string> <!-- Submission Test Result --> <!-- XHED: Page headline for test result --> - <string name="submission_test_result_headline">"Test result"</string> + <string name="submission_test_result_headline">"Test Result"</string> <!-- XHED: Page subheadline for test result --> <string name="submission_test_result_subtitle">"How this works:"</string> <!-- XHED: Page headline for results next steps --> <string name="submission_test_result_steps_added_heading">"Test added successfully"</string> <!-- YTXT: Body text for for results next steps --> - <string name="submission_test_result_steps_added_body">"Your test has been registered in the Corona-Warn-App."</string> + <string name="submission_test_result_steps_added_body">"Your test has been stored in the Corona-Warn-App."</string> <!-- XHED: Page headline for pending test result next steps --> - <string name="submission_test_result_pending_steps_waiting_heading">"Test result is not yet available."</string> + <string name="submission_test_result_pending_steps_waiting_heading">"Test result is not yet available"</string> <!-- YTXT: Body text for next steps section of waiting test result page --> <string name="submission_test_result_pending_steps_waiting_body">"Your test result is not yet available."</string> <!-- XBUT: test result pending : refresh button --> @@ -669,9 +697,9 @@ <!-- XBUT: invalid test result : remove the test button --> <string name="submission_test_result_invalid_remove_test_button">"Delete Test"</string> <!-- XHED: Dialog title for tracing required dailog --> - <string name="submission_test_result_dialog_tracing_required_title">"Risk identification required"</string> + <string name="submission_test_result_dialog_tracing_required_title">"Exposure Logging required"</string> <!-- YTXT: Dialog text for tracing required dialog--> - <string name="submission_test_result_dialog_tracing_required_message">"Please activate risk identification to warn other people."</string> + <string name="submission_test_result_dialog_tracing_required_message">"Please activate exposure logging to warn other people."</string> <!-- XBUT: tracing required : OK button --> <string name="submission_test_result_dialog_tracing_required_button">"OK"</string> <!-- XHED: Dialog title for test removal --> @@ -707,14 +735,14 @@ <!-- XHED: Page headline for menu the at start of the submission process --> <string name="submission_intro_headline">"This is how the Corona-Warn-App works"</string> <!-- YTXT: submission introduction text --> - <string name="submission_intro_text">"For the app to work well, we are relying on the support of people who were diagnosed with COVID-19. Since only encrypted random IDs are exchanged, you remain anonymous. You can now proceed as follows:"</string> + <string name="submission_intro_text">"For the app to work well, we are relying on the support of people who were diagnosed with COVID-19.\n\nSince only encrypted random IDs are exchanged, you remain anonymous. You can now proceed as follows:"</string> <!-- XBUT: Submission introduction next button--> <string name="submission_intro_button_next">"Next"</string> <!-- XACT: Submission intro - illustration description, explanation image --> <string name="submission_intro_illustration_description">"An encrypted positive test diagnosis is transmitted to the system, which will now warn other users."</string> <!-- YTXT: submission introduction bullet points --> <string-array name="submission_intro_bullet_points"> - <item>"If you have been diagnosed with COVID-19, you can warn others."</item> + <item>"If you have been diagnosed with COVID-19, you can notify others."</item> <item>"If you were given a TAN for a positive diagnosis, you can use this to register the test."</item> <item>"If you do not have a TAN, you can request one by telephone."</item> </string-array> @@ -725,25 +753,25 @@ <!-- XHED: Page headline for dispatcher menu --> <string name="submission_dispatcher_headline">"Selection"</string> <!-- XHED: Page subheadline for dispatcher menu --> - <string name="submission_dispatcher_subheadline">"What information is here for you?"</string> + <string name="submission_dispatcher_subheadline">"What information do you have?"</string> <!-- YTXT: Dispatcher text for QR code option --> <string name="submission_dispatcher_card_qr">"Document with QR code"</string> <!-- YTXT: Body text for QR code dispatcher option --> <string name="submission_dispatcher_qr_card_text">"Register your test by scanning the QR code of your test document."</string> <!-- XHED: Dialog headline for dispatcher QR prviacy dialog --> <string name="submission_dispatcher_qr_privacy_dialog_headline">"Declaration of Consent"</string> - <!-- YTXT: Dialog Body text for QR privacy dialog --> - <string name="submission_dispatcher_qr_privacy_dialog_body">"By tapping on “Allowâ€, you consent to the App querying the status of your coronavirus test and displaying it in the App. This feature is available to you if you have received a QR code and have consented to your test result being transmitted to the App’s server system. As soon as the testing lab has stored your test result on the server, you will be able to see the result in the App. If you have enabled notifications, you will also receive a notification outside the App telling you that your test result has been received. However, for privacy reasons, the test result itself will only be displayed in the App. You can withdraw this consent at any time by deleting your test registration in the App. Withdrawing your consent will not affect the lawfulness of processing before its withdrawal. Further information can be found in the menu under “Data Privacy Informationâ€."</string> + <!-- YTXT: Dialog Body text for dispatcher QR privacy dialog --> + <string name="submission_dispatcher_qr_privacy_dialog_body">"By tapping on “Acceptâ€, you consent to the App querying the status of your coronavirus test and displaying it in the App. This feature is available to you if you have received a QR code and have consented to your test result being transmitted to the App’s server system. As soon as the testing lab has stored your test result on the server, you will be able to see the result in the App. If you have enabled notifications, you will also receive a notification outside the App telling you that your test result has been received. However, for privacy reasons, the test result itself will only be displayed in the App. You can withdraw this consent at any time by deleting your test registration in the App. Withdrawing your consent will not affect the lawfulness of processing before its withdrawal. Further information can be found in the menu under “Data Privacy Informationâ€."</string> <!-- XBUT: submission(dispatcher QR Dialog) - positive button (right) --> - <string name="submission_dispatcher_qr_privacy_dialog_button_positive">"Allow"</string> + <string name="submission_dispatcher_qr_privacy_dialog_button_positive">"Accept"</string> <!-- XBUT: submission(dispatcher QR Dialog) - negative button (left) --> - <string name="submission_dispatcher_qr_privacy_dialog_button_negative">"Do Not Allow"</string> + <string name="submission_dispatcher_qr_privacy_dialog_button_negative">"Do Not Accept"</string> <!-- YTXT: Dispatcher text for TAN code option --> <string name="submission_dispatcher_card_tan_code">"TAN"</string> <!-- YTXT: Body text for TAN code dispatcher option --> <string name="submission_dispatcher_tan_code_card_text">"Register your test by entering your TAN manually."</string> <!-- YTXT: Dispatcher text for TELE-TAN option --> - <string name="submission_dispatcher_card_tan_tele">"Still no TAN?"</string> + <string name="submission_dispatcher_card_tan_tele">"No TAN yet?"</string> <!-- YTXT: Body text for TELE_TAN dispatcher option --> <string name="submission_dispatcher_tan_tele_card_text">"Please call us if you have been diagnosed with COVID-19."</string> <!-- XACT: Dispatcher Tan page title --> @@ -759,7 +787,7 @@ <!-- XHED: Title for the privacy card--> <string name="submission_positive_other_warning_privacy_title">"Data Privacy"</string> <!-- YTXT: Body text for the privacy card--> - <string name="submission_positive_other_warning_privacy_body">"By tapping on “Acceptâ€, you consent to the App sending your positive test result to the App’s server system along with your random IDs from the last 14 days, so that other App users who have enabled the risk identification feature can be automatically notified that they may have been exposed to a risk of infection. The random IDs transmitted for this purpose do not contain any information that would allow conclusions to be drawn about your identity or your person. \n\nTransmitting your test result via the App is voluntary. You will not be penalised if you do not transmit your test result. Since it is not possible to trace or check whether and how you use the App, nobody but you will know whether you have transmitted the information that you are infected.\n\nYou can withdraw your consent at any time by deleting the App. This withdrawal of your consent will not affect the lawfulness of the processing carried out on the basis of the consent prior to the withdrawal. Further information can be found in the menu under “Data Privacy Informationâ€.\n"</string> + <string name="submission_positive_other_warning_privacy_body">"By tapping on “Acceptâ€, you consent to the App sending your positive test result to the App’s server system along with your random IDs from the last 14 days, so that other App users who have enabled the exposure logging feature can be automatically notified that they may have been exposed to a risk of infection. The random IDs transmitted for this purpose do not contain any information that would allow conclusions to be drawn about your identity or your person. \n\nTransmitting your test result via the App is voluntary. You will not be penalized if you do not transmit your test result. Since it is not possible to trace or check whether and how you use the App, nobody but you will know whether you have transmitted the information that you are infected.\n\nYou can withdraw your consent at any time by deleting the App. This withdrawal of your consent will not affect the lawfulness of the processing carried out based on the consent prior to the withdrawal. Further information can be found in the menu under “Data Privacy Informationâ€."</string> <!-- XBUT: other warning continue button --> <string name="submission_positive_other_warning_button">"Next"</string> <!-- XACT: other warning - illustration description, explanation image --> @@ -805,18 +833,18 @@ <!-- YTXT: Body text for step 1 of contact page --> <string name="submission_contact_step_1_body">"Call the hotline and request a TAN:\n"</string> <!-- XLNK: Button / hyperlink to phone call for TAN contact page --> - <string name="submission_contact_number_display">"+49 (0)800 7540002"</string> - <!-- NOTR --> + <string name="submission_contact_number_display">"+49 800 7540002"</string> + <!-- XLNK: Technical number which is called when the user clicks on the display number --> <string name="submission_contact_number_dial">"+49 800 7540002"</string> <!-- YTXT: Body text for step 2 of contact page--> <string name="submission_contact_step_2_body">"Register the test by entering the TAN in the app."</string> <!-- YTXT: Body text for operating hours in contact page--> - <string name="submission_contact_operating_hours_body">"Business hours:\nMonday to Friday: 8am - 10pm\nSaturday and Sunday: 10am - 10pm\nThe standard charges of your telephone provider apply."</string> + <string name="submission_contact_operating_hours_body">"Languages: \nGerman, English, Turkish\n\nBusiness hours:\nMonday to Friday: 8am - 10pm; \nSaturday to Sunday: 10am - 10pm\n\nThe call is free of charge."</string> <!-- XACT: Submission contact page title --> <string name="submission_contact_accessibility_title">"Call the hotline and request a TAN"</string> - <!-- XACT: Content Description for submission contact step 1 --> - <string name="submission_contact_step_1_content">"In the first step, you call the hotline and request your TAN. You can reach the hotline on 0800 7540002. The business hours are Monday to Friday from 8 am to 10 pm and Saturday and Sunday from 10 am to 10 pm. The standard charges from your telephone provider apply."</string> + <!-- XACT: Content Description for submission contact step 1, number has to sync with the display number --> + <string name="submission_contact_step_1_content">"In the first step, you call the hotline and request your TAN. You can reach the hotline on +49 800 7540002. The business hours are Monday to Friday from 8 am to 10 pm and Saturday and Sunday from 10 am to 10 pm. The call is free of charge."</string> <!-- XACT: Content Description for submission contact step 2 --> <string name="submission_contact_step_2_content">"In the second step, you register your test with your TAN in the app."</string> @@ -832,15 +860,15 @@ <!-- XHED: Page title for the various submission status: positive --> <string name="submission_status_card_title_positive">"Positive Diagnosis"</string> <!-- XHED: Subtitle for the submission status card: invalid --> - <string name="submission_status_card_subtitle_invalid">"Invalid Diagnosis"</string> + <string name="submission_status_card_subtitle_invalid">"Invalid test"</string> <!-- XHED: Subtitle for the submission status card: negative --> <string name="submission_status_card_subtitle_negative">"Negative Diagnosis"</string> <!-- YTXT: Body text for submission status: fetching --> <string name="submission_status_card_body_fetching">"You result is being updated"</string> <!-- YTXT: Body text for submission status: unregistered --> - <string name="submission_status_card_body_unregistered">"Help to break the infection chain by warning others."</string> + <string name="submission_status_card_body_unregistered">"Help to break the infection chain by notifying others."</string> <!-- YTXT: Body text for submission status: pending --> - <string name="submission_status_card_body_pending">"The evaluation takes between one and three days."</string> + <string name="submission_status_card_body_pending">"The evaluation of your test is not yet done."</string> <!-- YTXT: Body text for submission status: invalid --> <string name="submission_status_card_body_invalid">"Your test could not be evaluated."</string> <!-- YTXT: Body text for submission status: positive --> @@ -884,7 +912,7 @@ </string-array> <!-- #################################### - Button Tooltips for Accessibility + Button Tooltips for Accessibility ###################################### --> <!-- XACT: back button--> <string name="button_back">"Back to previous page"</string> @@ -894,6 +922,22 @@ <string name="button_share">"Share"</string> <!-- XACT: menu button--> <string name="button_menu">"Menu"</string> + <!-- XACT: Accessibility needs a suffix to strings, to reduce the amount of manual translations this string is appended to accessibility button strings, e.g. "Zurück Taste", "Taste" is the default used by android in german --> + <string name="suffix_button">"Button"</string> + <!-- XACT: Accessibility needs a suffix to strings, to reduce the amount of manual translations this string is appended to accessibility content description strings for images, e.g. "Eine Gruppe von... Bild" --> + <string name="suffix_image">"Image"</string> + + <!-- #################################### + Business Error Messages + ###################################### --> + <!-- XTXT: error dialog - detailed text if device is offline --> + <string name="errors_no_network">"You are not connected to the Internet."</string> + <!-- XTXT: error dialog - detailed text if device has not enough device space --> + <string name="errors_not_enough_device_storage">"You do not have enough memory available."</string> + <!-- XTXT: error dialog - detailed text if there is error with Google API --> + <string name="errors_communication_with_api">"Error when communicating with Google API"</string> + <!-- XTXT: error dialog - detailed text if there is an error during external navigation / external action --> + <string name="errors_external_action">"You cannot perform this action. Please contact the hotline."</string> <!-- #################################### Generic Error Messages @@ -960,4 +1004,4 @@ <!-- NOTR --> <string name="test_api_calculate_risk_level">"Calculate Risk Level"</string> -</resources> +</resources> \ No newline at end of file diff --git a/Corona-Warn-App/src/main/res/values-night/colors.xml b/Corona-Warn-App/src/main/res/values-night/colors.xml index d3440a0be4c68276e3f5028a33a7b7a4142f0135..2c817a97a12ff797869888da9e575d85f767dd63 100644 --- a/Corona-Warn-App/src/main/res/values-night/colors.xml +++ b/Corona-Warn-App/src/main/res/values-night/colors.xml @@ -42,4 +42,14 @@ <!-- Misc --> <color name="colorTransparent">#00FFFFFF</color> + <!-- Tan Input --> + <color name="tanInputBackground">#1A17191A</color> + + <!-- Stable Colors --> + <color name="colorStableDark">#000000</color> + <color name="colorStableMedium">#4D17191A</color> + <color name="colorStableLight">#FFFFFF</color> + <color name="colorStableHairlineLight">#33FFFFFF</color> + <color name="colorStableHairlineDark">#3317191A</color> + </resources> diff --git a/Corona-Warn-App/src/main/res/values/colors.xml b/Corona-Warn-App/src/main/res/values/colors.xml index afd984e0fc6493ede543e6d436393a13435bf960..d7364070c058a4664fe3e663e9c31171cafe8381 100644 --- a/Corona-Warn-App/src/main/res/values/colors.xml +++ b/Corona-Warn-App/src/main/res/values/colors.xml @@ -23,7 +23,6 @@ <color name="colorTextSemanticGreen">#2E854B</color> <color name="colorTextSemanticNeutral">#5D6E80</color> <color name="colorTextTint">#007FAD</color> - <color name="colorTextLight">#FFFFFF</color> <!-- Semantic --> <color name="colorSemanticHighRisk">#C00F2D</color> @@ -42,7 +41,7 @@ <!-- Misc --> <color name="colorTransparent">#00FFFFFF</color> - <!-- Todo move to night colors? --> + <!-- Tan Input --> <color name="tanInputBackground">#1A17191A</color> diff --git a/Corona-Warn-App/src/main/res/values/dimens.xml b/Corona-Warn-App/src/main/res/values/dimens.xml index aa4bbad5f4a94dc01abc8f8e6ebaaf560ebdf1e3..148cc90bfe4039d4bb5340e43b778f6ed1aad71d 100644 --- a/Corona-Warn-App/src/main/res/values/dimens.xml +++ b/Corona-Warn-App/src/main/res/values/dimens.xml @@ -68,6 +68,7 @@ <dimen name="icon_size_button">40dp</dimen> <dimen name="icon_size_settings">40dp</dimen> <dimen name="icon_size_risk_details_behavior">25dp</dimen> + <dimen name="icon_size_external_link">18dp</dimen> <dimen name="icon_margin_risk_details_behavior">8dp</dimen> <!-- Circle sizes --> @@ -94,8 +95,6 @@ <!-- Submission Tan Input --> <dimen name="submission_tan_input_edittext_size">1dp</dimen> <dimen name="submission_tan_input_digit_radius">2dp</dimen> - <dimen name="submission_tan_input_digit_width">24dp</dimen> - <dimen name="submission_tan_input_digit_height">32dp</dimen> <dimen name="submission_tan_input_digit_spacing">3dp</dimen> <dimen name="submission_tan_input_digit_stroke">2dp</dimen> <dimen name="submission_tan_dash_width">6dp</dimen> @@ -103,6 +102,10 @@ <dimen name="submission_tan_dash_spacing_start">2dp</dimen> <dimen name="submission_tan_dash_spacing_end">5dp</dimen> <dimen name="submission_tan_line_spacing">16dp</dimen> + <dimen name="submission_tan_input_digit_min_width">20dp</dimen> + <dimen name="submission_tan_input_digit_max_width">48dp</dimen> + <dimen name="submission_tan_total_digit_spacing">6dp</dimen> + <dimen name="submission_tan_total_group_spacing">16dp</dimen> <!-- Submission QR Code Scan --> <dimen name="submission_scan_qr_code_viewfinder_size">240dp</dimen> diff --git a/Corona-Warn-App/src/main/res/values/strings.xml b/Corona-Warn-App/src/main/res/values/strings.xml index 8607dc7e69a2022ceb8dfd6b85f791094fd3134f..61f0ab3ff371190ec509517d85b6282d18223fb2 100644 --- a/Corona-Warn-App/src/main/res/values/strings.xml +++ b/Corona-Warn-App/src/main/res/values/strings.xml @@ -1,5 +1,4 @@ -<?xml version="1.0" encoding="UTF-8"?> -<resources xmlns:tools="http://schemas.android.com/tools" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2" tools:ignore="MissingTranslation"> +<?xml version="1.0" encoding="UTF-8"?><resources xmlns:tools="http://schemas.android.com/tools" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2" tools:ignore="MissingTranslation"> <!-- #################################### Preference Keys @@ -7,645 +6,588 @@ TODO: Check what is needed --> <!-- NOTR --> - <string name="preference_name"> - <xliff:g id="preference">shared_preferences_cwa</xliff:g> - </string> + <string name="preference_name"><xliff:g id="preference">"shared_preferences_cwa"</xliff:g></string> <!-- NOTR --> - <string name="preference_onboarding_completed"> - <xliff:g id="preference">preference_onboarding_completed</xliff:g> - </string> + <string name="preference_onboarding_completed"><xliff:g id="preference">"preference_onboarding_completed"</xliff:g></string> <!-- NOTR --> - <string name="preference_onboarding_completed_timestamp"> - <xliff:g id="preference">preference_onboarding_completed_timestamp</xliff:g> - </string> + <string name="preference_onboarding_completed_timestamp"><xliff:g id="preference">"preference_onboarding_completed_timestamp"</xliff:g></string> <!-- NOTR --> - <string name="preference_reset_app"> - <xliff:g id="preference">preference_reset_app</xliff:g> - </string> + <string name="preference_reset_app"><xliff:g id="preference">"preference_reset_app"</xliff:g></string> <!-- NOTR --> - <string name="preference_only_wifi"> - <xliff:g id="preference">preference_only_wifi</xliff:g> - </string> + <string name="preference_only_wifi"><xliff:g id="preference">"preference_only_wifi"</xliff:g></string> <!-- NOTR --> - <string name="preference_tracing"> - <xliff:g id="preference">preference_tracing</xliff:g> - </string> + <string name="preference_tracing"><xliff:g id="preference">"preference_tracing"</xliff:g></string> <!-- NOTR --> - <string name="preference_timestamp_diagnosis_keys_fetch"> - <xliff:g id="preference">preference_timestamp_diagnosis_keys_fetch</xliff:g> - </string> + <string name="preference_timestamp_diagnosis_keys_fetch"><xliff:g id="preference">"preference_timestamp_diagnosis_keys_fetch"</xliff:g></string> <!-- NOTR --> - <string name="preference_timestamp_manual_diagnosis_keys_retrieval"> - <xliff:g id="preference">preference_timestamp_manual_diagnosis_keys_retrieval</xliff:g> - </string> + <string name="preference_timestamp_manual_diagnosis_keys_retrieval"><xliff:g id="preference">"preference_timestamp_manual_diagnosis_keys_retrieval"</xliff:g></string> <!-- NOTR --> - <string name="preference_string_google_api_token"> - <xliff:g id="preference">preference_m_string_google_api_token</xliff:g> - </string> + <string name="preference_string_google_api_token"><xliff:g id="preference">"preference_m_string_google_api_token"</xliff:g></string> <!-- NOTR --> - <string name="preference_notifications_enabled"> - <xliff:g id="preference">preference_notifications_enabled</xliff:g> - </string> + <string name="preference_notifications_enabled"><xliff:g id="preference">"preference_notifications_enabled"</xliff:g></string> <!-- NOTR --> - <string name="preference_notifications_risk_enabled"> - <xliff:g id="preference">preference_notifications_risk_enabled</xliff:g> - </string> + <string name="preference_notifications_risk_enabled"><xliff:g id="preference">"preference_notifications_risk_enabled"</xliff:g></string> <!-- NOTR --> - <string name="preference_notifications_test_enabled"> - <xliff:g id="preference">preference_notifications_test_enabled</xliff:g> - </string> + <string name="preference_notifications_test_enabled"><xliff:g id="preference">"preference_notifications_test_enabled"</xliff:g></string> <!-- NOTR --> - <string name="preference_background_job_allowed"> - <xliff:g id="preference">preference_background_job_enabled</xliff:g> - </string> + <string name="preference_background_job_allowed"><xliff:g id="preference">"preference_background_job_enabled"</xliff:g></string> <!-- NOTR --> - <string name="preference_mobile_data_allowed"> - <xliff:g id="preference">preference_mobile_data_enabled</xliff:g> - </string> + <string name="preference_mobile_data_allowed"><xliff:g id="preference">"preference_mobile_data_enabled"</xliff:g></string> <!-- NOTR --> - <string name="preference_registration_token"> - <xliff:g id="preference">preference_registration_token</xliff:g> - </string> + <string name="preference_registration_token"><xliff:g id="preference">"preference_registration_token"</xliff:g></string> <!-- NOTR --> - <string name="preference_device_pairing_successful_time"> - <xliff:g id="preference">preference_device_pairing_successful_time</xliff:g> - </string> + <string name="preference_device_pairing_successful_time"><xliff:g id="preference">"preference_device_pairing_successful_time"</xliff:g></string> <!-- NOTR --> - <string name="preference_initial_tracing_activation_time"> - <xliff:g id="preference">preference_initial_tracing_activation_time</xliff:g> - </string> + <string name="preference_initial_tracing_activation_time"><xliff:g id="preference">"preference_initial_tracing_activation_time"</xliff:g></string> <!-- NOTR --> - <string name="preference_initial_result_received_time"> - <xliff:g id="preference">preference_initial_result_received_time</xliff:g> - </string> + <string name="preference_initial_result_received_time"><xliff:g id="preference">"preference_initial_result_received_time"</xliff:g></string> <!-- NOTR --> - <string name="preference_risk_level_score"> - <xliff:g id="preference">preference_risk_level_score</xliff:g> - </string> + <string name="preference_risk_level_score"><xliff:g id="preference">"preference_risk_level_score"</xliff:g></string> <!-- NOTR --> - <string name="preference_risk_level_score_successful"> - <xliff:g id="preference">preference_risk_level_score_successful</xliff:g> - </string> + <string name="preference_risk_level_score_successful"><xliff:g id="preference">"preference_risk_level_score_successful"</xliff:g></string> <!-- NOTR --> - <string name="preference_timestamp_risk_level_calculation"> - <xliff:g id="preference">preference_timestamp_risk_level_calculation</xliff:g> - </string> + <string name="preference_timestamp_risk_level_calculation"><xliff:g id="preference">"preference_timestamp_risk_level_calculation"</xliff:g></string> <!-- NOTR --> - <string name="preference_test_guid"> - <xliff:g id="preference">preference_test_guid</xliff:g> - </string> + <string name="preference_test_guid"><xliff:g id="preference">"preference_test_guid"</xliff:g></string> <!-- NOTR --> - <string name="preference_is_allowed_to_submit_diagnosis_keys"> - <xliff:g id="preference">preference_is_allowed_to_submit_diagnosis_keys</xliff:g> - </string> + <string name="preference_is_allowed_to_submit_diagnosis_keys"><xliff:g id="preference">"preference_is_allowed_to_submit_diagnosis_keys"</xliff:g></string> <!-- NOTR --> - <string name="preference_auth_code"> - <xliff:g id="preference">preference_auth_code</xliff:g> - </string> + <string name="preference_auth_code"><xliff:g id="preference">"preference_auth_code"</xliff:g></string> <!-- NOTR --> - <string name="preference_database_password"> - <xliff:g id="preference">preference_database_password</xliff:g> - </string> + <string name="preference_database_password"><xliff:g id="preference">"preference_database_password"</xliff:g></string> <!-- NOTR --> - <string name="preference_total_non_active_tracing"> - <xliff:g id="preference">preference_total_non_active_tracing</xliff:g> - </string> + <string name="preference_total_non_active_tracing"><xliff:g id="preference">"preference_total_non_active_tracing"</xliff:g></string> <!-- NOTR --> - <string name="preference_last_non_active_tracing_timestamp"> - <xliff:g id="preference">preference_last_non_active_tracing_timestamp</xliff:g> - </string> + <string name="preference_last_non_active_tracing_timestamp"><xliff:g id="preference">"preference_last_non_active_tracing_timestamp"</xliff:g></string> <!-- NOTR --> - <string name="preference_number_successful_submissions"> - <xliff:g id="preference">preference_number_successful_submissions</xliff:g> - </string> + <string name="preference_number_successful_submissions"><xliff:g id="preference">"preference_number_successful_submissions"</xliff:g></string> <!-- NOTR --> - <string name="preference_teletan"> - <xliff:g id="preference">preference_teletan</xliff:g> - </string> + <string name="preference_teletan"><xliff:g id="preference">"preference_teletan"</xliff:g></string> <!-- NOTR --> - <string name="preference_last_three_hours_from_server"> - <xliff:g id="preference">preference_last_three_hours_from_server</xliff:g> - </string> + <string name="preference_last_three_hours_from_server"><xliff:g id="preference">"preference_last_three_hours_from_server"</xliff:g></string> <!-- NOTR --> - <string name="preference_polling_test_result_started"> - <xliff:g id="preference">preference_polling_test_result_started</xliff:g> - </string> + <string name="preference_polling_test_result_started"><xliff:g id="preference">"preference_polling_test_result_started"</xliff:g></string> <!-- NOTR --> - <string name="preference_test_result_notification"> - <xliff:g id="preference">preference_test_result_notification</xliff:g> - </string> + <string name="preference_test_result_notification"><xliff:g id="preference">"preference_test_result_notification"</xliff:g></string> <!-- #################################### Generics ###################################### --> <!-- XACT: back description for screen readers --> - <string name="accessibility_back">Zurück</string> + <string name="accessibility_back">"Back"</string> <!-- XACT: next description for screen readers --> - <string name="accessibility_next">Weiter</string> + <string name="accessibility_next">"Next"</string> <!-- XACT: menu description for screen readers --> - <string name="accessibility_menu">Menu</string> + <string name="accessibility_menu">"Menu"</string> <!-- XACT: menu description for screen readers --> - <string name="accessibility_close">Schließen</string> + <string name="accessibility_close">"Close"</string> + <!-- XACT: menu description for screen readers --> + <string name="accessibility_logo">"Corona-Warn-App"</string> <!-- #################################### Menu ###################################### --> <!-- XMIT: application overview --> - <string name="menu_help">Ãœberblick</string> + <string name="menu_help">"Overview"</string> <!-- XMIT: application information --> - <string name="menu_information">App-Informationen</string> + <string name="menu_information">"App Information"</string> <!-- XMIT: application settings --> - <string name="menu_settings">Einstellungen</string> + <string name="menu_settings">"Settings"</string> <!-- #################################### Notification ###################################### --> <!-- NOTR --> - <string name="notification_channel_id"> - <xliff:g id="notification_channel_id">de.rki.coronawarnapp.notification.exposureNotificationChannelId</xliff:g> - </string> + <string name="notification_channel_id"><xliff:g id="notification_channel_id">"de.rki.coronawarnapp.notification.exposureNotificationChannelId"</xliff:g></string> <!-- NOTR --> - <string name="notification_id"> - <xliff:g id="notification_id">1</xliff:g> - </string> + <string name="notification_id"><xliff:g id="notification_id">"1"</xliff:g></string> <!-- XTXT: Notification channel name for os settings --> - <string name="notification_name">Corona-Warn-App</string> + <string name="notification_name">"Corona-Warn-App"</string> <!-- XTXT: Notification channel description for os settings --> - <string name="notification_description">Benachrichtigungen aus der Corona-Warn-App.</string> + <string name="notification_description">"Notifications from the Corona-Warn-App"</string> <!-- XHED: Notification title --> - <string name="notification_headline">Corona-Warn-App</string> + <string name="notification_headline">"Corona-Warn-App"</string> <!-- XTXT: Notification body --> - <string name="notification_body">Es gibt Neuigkeiten von ihrer Corona-Warn-App</string> + <string name="notification_body">"You have new messages from your Corona-Warn-App."</string> <!-- #################################### App Auto Update ###################################### --> <!-- XHED: App Auto Update dialog title --> - <string name="update_dialog_title">Update verfügbar</string> + <string name="update_dialog_title">"Update available"</string> <!-- XTXT: App Auto Update dialog message --> - <string name="update_dialog_message">Bitte beachten Sie: Sie können die Corona-Warn-App erst wieder benutzen, wenn Sie das neueste Update installiert haben.</string> + <string name="update_dialog_message">"Please note, you can only use the Corona-Warn-App again once you have installed the latest update."</string> <!-- XBUT: App Auto Update button --> - <string name="update_dialog_button">Update</string> + <string name="update_dialog_button">"Update"</string> <!-- #################################### Risk Card ###################################### --> <!-- XTXT: risk card - no contact yet --> - <string name="risk_card_body_contact">Bisher keine Risiko-Begegnungen</string> + <string name="risk_card_body_contact">"No exposures up to now"</string> <!-- XTXT: risk card - number of contacts for one or more --> <plurals name="risk_card_body_contact_value"> - <item quantity="one">%1$s Risikobegegnung</item> - <item quantity="other">%1$s Risikobegegnungen</item> + <item quantity="one">"%1$s exposure"</item> + <item quantity="other">"%1$s exposures"</item> </plurals> <!-- XTXT: risk card - tracing active for x out of 14 days --> - <string name="risk_card_body_saved_days">%1$s von 14 Tagen aktiv</string> + <string name="risk_card_body_saved_days">"%1$s of days active"</string> <!-- XTXT; risk card - no update done yet --> - <string name="risk_card_body_not_yet_fetched">Kontakte wurden noch nicht überprüft.</string> + <string name="risk_card_body_not_yet_fetched">"Encounters have not yet been checked."</string> <!-- XTXT: risk card - last successful update --> - <string name="risk_card_body_time_fetched">Aktualisiert: %1$s</string> + <string name="risk_card_body_time_fetched">"Updated: %1$s"</string> <!-- XTXT: risk card - next update --> - <string name="risk_card_body_next_update">Tägliche Aktualisierung</string> + <string name="risk_card_body_next_update">"Updated daily"</string> <!-- XBUT: risk card - update risk --> - <string name="risk_card_button_update">Aktualisieren</string> + <string name="risk_card_button_update">"Update"</string> <!-- XBUT: risk card - update risk with time display --> - <string name="risk_card_button_cooldown">Aktualisierung in %1$s</string> + <string name="risk_card_button_cooldown">"Update in %1$s"</string> <!-- XBUT: risk card - activate tracing --> - <string name="risk_card_button_enable_tracing">Risiko-Ermittlung einschalten</string> + <string name="risk_card_button_enable_tracing">"Activate Exposure Logging"</string> <!-- XTXT: risk card - tracing is off, user should activate to get an updated risk level --> - <string name="risk_card_body_tracing_off">Aktivieren Sie die Risiko-Ermittlung, um Ihren heutige Risiko-Einschätzung zu berechnen.</string> + <string name="risk_card_body_tracing_off">"Activate exposure logging to evaluate your risk status today."</string> <!-- XHED: risk card - low risk headline --> - <string name="risk_card_low_risk_headline">Niedriges Risiko</string> + <string name="risk_card_low_risk_headline">"Low Risk"</string> <!-- XHED: risk card - increased risk headline --> - <string name="risk_card_increased_risk_headline">Erhöhtes Risiko</string> + <string name="risk_card_increased_risk_headline">"Higher Risk"</string> <!-- XTXT: risk card - increased risk days since last contact --> <plurals name="risk_card_increased_risk_body_contact_last"> - <item quantity="one">%1$s Tag seit der letzten Begegnung</item> - <item quantity="other">%1$s Tage seit der letzten Begegnung</item> + <item quantity="one">"%1$s day since the last encounter"</item> + <item quantity="other">"%1$s days since the last encounter"</item> </plurals> <!-- XHED: risk card - unknown risk headline --> - <string name="risk_card_unknown_risk_headline">Unbekanntes Risiko</string> + <string name="risk_card_unknown_risk_headline">"Risk Unknown"</string> <!-- XTXT: risk card - tracing isn't active long enough, so a new risk level can't be calculated --> - <string name="risk_card_unknown_risk_body">Da Sie die Risiko-Ermittlung noch nicht lange genug aktiviert haben, konnten wir für Sie kein Infektionsrisiko berechnen.</string> + <string name="risk_card_unknown_risk_body">"Since you have not activated exposure logging for long enough, we could not calculate your risk of infection."</string> <!-- XHED: risk card - tracing stopped headline, due to no possible calculation --> - <string name="risk_card_no_calculation_possible_headline">Risiko-Ermittlung gestoppt</string> + <string name="risk_card_no_calculation_possible_headline">"Exposure logging stopped"</string> <!-- XTXT: risk card - last successfully calculated risk level --> - <string name="risk_card_no_calculation_possible_body_saved_risk">Letzte Ermittlung:<xliff:g id="line_break">\n</xliff:g>%1$s</string> + <string name="risk_card_no_calculation_possible_body_saved_risk">"Last exposure logging:"<xliff:g id="line_break"/>" %1$s"</string> <!-- XHED: risk card - outdated risk headline, calculation isn't possible --> - <string name="risk_card_outdated_risk_headline">Risiko-Ermittlung nicht möglich</string> + <string name="risk_card_outdated_risk_headline">"Exposure logging is not possible"</string> <!-- XTXT: risk card - outdated risk, calculation couldn't be updated in the last 24 hours --> - <string name="risk_card_outdated_risk_body">Ihre Risiko-Berechnung konnte seit mehr als 24 Stunden nicht aktualisiert werden.</string> + <string name="risk_card_outdated_risk_body">"Your exposure logging could not be updated for more than 24 hours."</string> <!-- XHED: risk card - loading headline, update is ongoing --> - <string name="risk_card_loading_headline">Prüfung läuft…</string> + <string name="risk_card_loading_headline">"Check is running..."</string> <!-- XTXT: risk card - loading, data is downloaded and will be checked, this can take several minutes --> - <string name="risk_card_loading_body">Es werden aktuelle Daten heruntergeladen und geprüft. Dies kann mehrere Minuten dauern.</string> + <string name="risk_card_loading_body">"Current data is being downloaded and checked.\nThis can take several minutes."</string> <!-- #################################### Main ###################################### --> <!-- XHED: main, FAQ --> - <string name="main_about_headline">Häufige Fragen</string> + <string name="main_about_headline">"FAQ"</string> <!-- XTXT: main, explains faq on card --> - <string name="main_about_body">Hier finden Sie Antworten auf häufig gestellte Fragen rund um die Corona-Warn-App.</string> + <string name="main_about_body">"Here you can find answers to frequently asked questions about the Corona-Warn-App. You will be forwarded to an external website."</string> <!-- NOTR --> - <string name="main_about_link">https://www.bundesregierung.de/corona-warn-app-faq</string> + <string name="main_about_link">"http://www.bundesregierung.de/corona-warn-app-faq-englisch"</string> <!-- XACT: Opens external webpage --> - <string name="hint_external_webpage">Häufige Fragen, hier finden Sie Antworten auf häufig gestellte Fragen rund um die Corona-Warn-App. Aufruf externer Infos im Web.</string> + <string name="hint_external_webpage">"Here you can find answers to frequently asked questions about the Corona-Warn-App. You will be forwarded to an external website."</string> <!-- #################################### Main - Share ###################################### --> <!-- XHED: Share app link page title --> - <string name="main_share_title">Corona-Warn-App teilen</string> + <string name="main_share_title">"Share the Corona-Warn-App"</string> <!-- XHED: Share app link page subtitle --> - <string name="main_share_headline">Gemeinsam Corona bekämpfen</string> + <string name="main_share_headline">"Let\'s fight coronavirus together"</string> <!-- YTXT: Share app link page body --> - <string name="main_share_body">Je mehr Menschen mitmachen, desto besser durchbrechen wir Infektionsketten. Laden Sie Familie, Freunde und Bekannte ein!</string> + <string name="main_share_body">"The more people who use the app, the faster we can break the infection chain. Please invite your family and friends to download the app."</string> <!-- XBUT: Share app link page button --> - <string name="main_share_button">Download-Link versenden</string> + <string name="main_share_button">"Send Download Link"</string> <!-- YMSG: Message when sharing is executed --> - <string name="main_share_message">Gemeinsam Corona bekämpfen<xliff:g id="line_break">\n</xliff:g>Ich bin dabei. Du auch?<xliff:g id="line_break">\n</xliff:g><xliff:g id="link_play_store">https://www.coronawarn.app/</xliff:g><xliff:g id="line_break">\n</xliff:g></string> + <string name="main_share_message">"Fighting coronavirus together"<xliff:g id="line_break">"\n"</xliff:g>"I\'m in on this, you too?"<xliff:g id="line_break">"\n"</xliff:g><xliff:g id="link_play_store">"https://www.corona-warn-app.de"</xliff:g><xliff:g id="line_break">"\n"</xliff:g></string> <!-- XACT: main (share) - illustraction description, explanation image --> - <string name="main_share_illustration_description">Ein Mann teilt die Corona-Warn-App mit vier anderen Personen.</string> + <string name="main_share_illustration_description">"One man is sharing the Corona-Warn-App with four other people."</string> <!-- #################################### Main - Overview ###################################### --> <!-- XHED: App overview page title --> - <string name="main_overview_title">Ãœberblick</string> + <string name="main_overview_title">"Overview"</string> <!-- XACT: main overview page title --> - <string name="main_overview_accessibility_title">Ãœberblick</string> + <string name="main_overview_accessibility_title">"Overview"</string> <!-- XHED: App overview subtitle for tracing explanation--> - <string name="main_overview_subtitle_tracing">Risiko-Ermittlung</string> + <string name="main_overview_subtitle_tracing">"Exposure Logging"</string> <!-- YTXT: App overview body text about tracing --> - <string name="main_overview_body_tracing">Die Risiko-Ermittlung ist eine der drei zentralen Funktionen der App. Ist sie aktiv, werden Begegnungen aufgezeichnet. Sie brauchen sich um nichts mehr zu kümmern.</string> + <string name="main_overview_body_tracing">"Exposure logging is one of the three central features of the app. When you activate it, encounters with people\'s devices are logged. You don\'t have to do anything else."</string> <!-- XHED: App overview subtitle for risk explanation --> - <string name="main_overview_subtitle_risk">Infektionsrisiko</string> + <string name="main_overview_subtitle_risk">"Risk of Infection"</string> <!-- YTXT: App overview body text about risk levels --> - <string name="main_overview_body_risk">Sind Sie innerhalb der letzten 14 Tage einer Corona-positiven Person begegnet, berechnet die App Ihr persönliches Infektionsrisiko. Als Grundlage dafür misst sie, über welche Dauer und mit welchem Abstand eine Begegnung stattfand.</string> + <string name="main_overview_body_risk">"If you have had contact within the last 14 days with a person who was diagnosed with COVID-19, the app calculates your personal risk of infection. It does this by measuring duration and proximity of the exposure."</string> <!-- XHED: App overview subtitle for risk level list --> - <string name="main_overview_subtitle_risk_levels">Folgende Risikostufen können angezeigt werden:</string> + <string name="main_overview_subtitle_risk_levels">"The following risk status can be shown:"</string> <!-- XTXT: App overview increased risk level --> - <string name="main_overview_subtitle_increased_risk">Erhöhtes Risiko</string> + <string name="main_overview_subtitle_increased_risk">"Higher Risk"</string> <!-- XTXT: App overview low risk level --> - <string name="main_overview_subtitle_low_risk">Niedriges Risiko</string> + <string name="main_overview_subtitle_low_risk">"Low Risk"</string> <!-- XTXT: App overview unknown risk level --> - <string name="main_overview_subtitle_unknown_risk">Unbekanntes Risiko</string> + <string name="main_overview_subtitle_unknown_risk">"Risk Unknown"</string> <!-- XHED: App overview subtitle for test procedure explanation --> - <string name="main_overview_headline_test">Benachrichtigung Anderer</string> + <string name="main_overview_headline_test">"Notifying Other Users"</string> <!-- YTXT: App overview body text about rest procedure --> - <string name="main_overview_body_test">Eine weitere zentrale Funktion. Hier können Sie Ihren Test registrieren und seinen Status abfragen. Bei einem positiven Test können Sie andere warnen und damit Infektionsketten unterbrechen.</string> + <string name="main_overview_body_test">"Another central feature is registering your test and retrieving the result. If you are diagnosed with COVID-19, you can notify others and break the chain of infection."</string> <!-- XHED: App overview headline for glossary --> - <string name="main_overview_headline_glossary">Wichtige Begriffe:</string> + <string name="main_overview_headline_glossary">"Definition of Terms:"</string> <!-- XHED: App overview subtitle for glossary key storage --> - <string name="main_overview_subtitle_glossary_tracing">Begegnungs-Aufzeichnung</string> + <string name="main_overview_subtitle_glossary_tracing">"Exposure Log"</string> <!-- YTXT: App overview body for glossary key storage --> - <string name="main_overview_body_glossary_tracing">Liste der empfangenen und vorübergehend im Betriebssystemspeicher abgelegten kurzlebigen Zufallscodes. Diese Liste wird bei der Risiko-Ãœberprüfung gelesen. Alle Zufallscodes werden nach 14 Tagen automatisch gelöscht.</string> + <string name="main_overview_body_glossary_tracing">"List of received and temporary random IDs saved temporarily in the operating system storage. This list is read when the exposures are checked. All random IDs are automatically deleted after 14 days."</string> <!-- XHED: App overview subtitle for glossary risk calculation --> - <string name="main_overview_subtitle_glossary_calculation">Risiko-Ãœberprüfung</string> + <string name="main_overview_subtitle_glossary_calculation">"Exposure Check"</string> <!-- YTXT: App overview body for glossary risk calculation --> - <string name="main_overview_body_glossary_calculation">Abfrage der Begegnungs-Aufzeichnung und Abgleich mit den gemeldeten Infektionen anderer Nutzerinnen und Nutzer. Die Risiko-Ãœberprüfung erfolgt automatisch ungefähr alle zwei Stunden.</string> + <string name="main_overview_body_glossary_calculation">"Exposure log data is retrieved and synchronized with reported infections of other users. The exposure check is performed automatically about every two hours."</string> <!-- XHED: App overview subtitle for glossary contact --> - <string name="main_overview_subtitle_glossary_contact">Risiko-Begegnungen</string> + <string name="main_overview_subtitle_glossary_contact">"Exposures"</string> <!-- YTXT: App overview body for glossary contact --> - <string name="main_overview_body_glossary_contact">Jene Begegnungen mit einer Corona-positiv getesteten Person, die über einen längeren Zeitraum und in geringer Distanz stattfanden.</string> + <string name="main_overview_body_glossary_contact">"Encounters over a longer duration and close proximity to people diagnosed with COVID-19."</string> <!-- XHED: App overview subtitle for glossary notifications --> - <string name="main_overview_subtitle_glossary_notification">Risiko-Benachrichtigung</string> + <string name="main_overview_subtitle_glossary_notification">"Exposure Notification"</string> <!-- YTXT: App overview body for glossary notifications --> - <string name="main_overview_body_glossary_notification">Die Anzeige von Risiko-Begegnungen in der Corona-Warn-App.</string> + <string name="main_overview_body_glossary_notification">"Display exposures in the Corona-Warn-App."</string> <!-- XHED: App overview subtitle for glossary keys --> - <string name="main_overview_subtitle_glossary_keys">Zufallscode</string> + <string name="main_overview_subtitle_glossary_keys">"Random ID"</string> <!-- YTXT: App overview body for glossary keys --> - <string name="main_overview_body_glossary_keys">Die Zufallscodes sind zufällig erzeugte Zahlen- und Buchstabenkombinationen. Sie werden zwischen benachbarten Smartphones ausgetauscht. Zufallskennungen lassen sich nicht einer bestimmten Person zuordnen und werden nach 14 Tagen automatisch gelöscht. Eine Corona-positiv getestete Person kann ihre Zufallscodes der letzten bis zu 14 Tage freiwillig mit anderen CWA-Nutzern teilen.</string> + <string name="main_overview_body_glossary_keys">"Random IDs are combinations of digits and letters generated randomly. They are exchanged between devices in close proximity. Random IDs cannot be assigned to a specific person and are automatically deleted after 14 days. People diagnosed with COVID-19 can opt to share their random IDs of up to the last 14 days with other app users."</string> <!-- XACT: main (overview) - illustraction description, explanation image --> - <string name="main_overview_illustration_description">Ein Smartphone zeigt unterschiedliche Inhalte, die von eins bis drei nummeriert sind.</string> + <string name="main_overview_illustration_description">"One device shows different content numbered from 1 to 3."</string> <!-- XACT: App main page title --> - <string name="main_title">Hauptseite der Corona-Warn App</string> + <string name="main_title">"Main page of the Corona-Warn-App"</string> <!-- #################################### Risk Details ###################################### --> <!-- XHED: risk details - page title, in toolbar --> - <string name="risk_details_title">Ihr Risikostatus</string> + <string name="risk_details_title">"Your Risk Status"</string> <!-- XHED: risk details - headline, how a user should act --> - <string name="risk_details_headline_behavior">Verhalten</string> + <string name="risk_details_headline_behavior">"Recommendations"</string> <!-- XHED: risk details - multiline headline, bold, how to act correct --> - <string name="risk_details_subtitle_behavior">So verhalten Sie sich richtig</string> + <string name="risk_details_subtitle_behavior">"This is what you should do"</string> <!-- XMSG: risk details - go/stay home, something like a bullet point --> - <string name="risk_details_behavior_body_stay_home">Begeben Sie sich umgehend nach Hause bzw. bleiben Sie zu Hause.</string> + <string name="risk_details_behavior_body_stay_home">"If possible, please go home and stay at home."</string> <!-- XMSG: risk details - get in touch with the corresponding people, something like a bullet point --> - <string name="risk_details_behavior_body_contact_doctor">Für Fragen zu auftretenden Symptomen, Testmöglichkeiten und weiteren Isolationsmaßnahmen wenden Sie sich bitte an eine der folgenden Stellen:</string> + <string name="risk_details_behavior_body_contact_doctor">"If you have questions about symptoms, testing possibilities, or additional isolation measures, please contact one of the following:"</string> <!-- XMSG: risk details - wash your hands, something like a bullet point --> - <string name="risk_details_behavior_body_wash_hands">Waschen Sie Ihre Hände regelmäßig.</string> + <string name="risk_details_behavior_body_wash_hands">"Wash your hands regularly."</string> <!-- XMSG: risk details - wear a face mask, something like a bullet point --> - <string name="risk_details_behavior_body_wear_mask">Tragen Sie einen Mundschutz bei Kontakt mit anderen Personen.</string> + <string name="risk_details_behavior_body_wear_mask">"Wear a face mask when you encounter other people."</string> <!-- XMSG: risk details - stay 1,5 away, something like a bullet point --> - <string name="risk_details_behavior_body_stay_away">Halten Sie mindestens 1,5 Meter Abstand zu anderen Personen.</string> + <string name="risk_details_behavior_body_stay_away">"Keep at least 1.5 meters distance from other people."</string> <!-- XMSG: risk details - cough/sneeze, something like a bullet point --> - <string name="risk_details_behavior_body_cough_sneeze">Niesen oder husten Sie in die Armbeuge oder in ein Taschentuch.</string> + <string name="risk_details_behavior_body_cough_sneeze">"Sneeze or cough into your elbow or a tissue."</string> <!-- XMSG: risk details - contact your doctor, bullet point --> - <string name="risk_details_behavior_increased_body_1">- Ihre Hausärztin/Ihren Hausarzt</string> + <string name="risk_details_behavior_increased_body_1">"Your general practitioner"</string> <!-- XMSG: risk details - panel doctor on-call service, bullet point --> - <string name="risk_details_behavior_increased_body_2">- Den ärztlichen Bereitschaftsdienst unter der Telefonnummer: 116117</string> + <string name="risk_details_behavior_increased_body_2">"General medical emergency service on telephone number 116117"</string> <!-- XMSG: risk details - public health department, bullet point --> - <string name="risk_details_behavior_increased_body_3">- Ihr Gesundheitsamt</string> + <string name="risk_details_behavior_increased_body_3">"Your public health authority"</string> <!-- XHED: risk details - infection risk headline, below behaviors --> - <string name="risk_details_headline_infection_risk">Infektionsrisiko</string> + <string name="risk_details_headline_infection_risk">"Risk of Infection"</string> <!-- XHED: risk details - how your risk level was calculated, below behaviors --> - <string name="risk_details_subtitle_infection_risk_past">So wurde Ihr Risiko ermittelt</string> + <string name="risk_details_subtitle_infection_risk_past">"This is how your risk was calculated"</string> <!-- XHED: risk details - how your risk level will be calculated, below behaviors --> - <string name="risk_details_subtitle_infection_risk">So wird Ihr Risiko ermittelt</string> + <string name="risk_details_subtitle_infection_risk">"This is how your risk is calculated"</string> <!-- XMSG: risk details - risk couldn't be calculated tracing wasn't enabled long enough, below behaviors --> - <string name="risk_details_information_body_unknown_risk">Da Sie die Risiko-Ermittlung noch nicht lange genug aktiviert haben, konnten wir für Sie kein Infektionsrisiko berechnen.</string> + <string name="risk_details_information_body_unknown_risk">"Since you have not activated exposure logging for long enough, we could not calculate your risk of infection."</string> <!-- XMSG: risk details - risk calculation wasn't possible for 24h, below behaviors --> - <string name="risk_details_information_body_outdated_risk">Ihre Risiko-Berechnung konnte seit mehr als 24 Stunden nicht aktualisiert werden.</string> + <string name="risk_details_information_body_outdated_risk">"Your exposure logging could not be updated for more than 24 hours."</string> <!-- YTXT: risk details - low risk explanation text --> - <string name="risk_details_information_body_low_risk">Sie haben ein niedriges Infektionsrisiko, da keine Begegnung mit nachweislich Coronapositiv getesteten Personen aufgezeichnet wurde oder sich Ihre Begegnung auf kurze Zeit und einen größeren Abstand beschränkt hat.</string> + <string name="risk_details_information_body_low_risk">"You have a low risk of infection because no exposure to people later diagnosed with COVID-19 was logged, or because your encounters were only for a short time and at a greater distance."</string> <!-- YTXT: risk details - increased risk explanation text with variable for day(s) since last contact --> <plurals name="risk_details_information_body_increased_risk"> - <item quantity="one">Sie haben ein erhöhtes Infektionsrisiko, da Sie zuletzt vor %1$s Tag mindestens einer- Corona positiv-getesteten Person über einen längeren Zeitraum und mit einem geringen Abstand begegnet sind.</item> - <item quantity="other">Sie haben ein erhöhtes Infektionsrisiko, da Sie zuletzt vor %1$s Tagen mindestens einer- Corona positiv-getesteten Person über einen längeren Zeitraum und mit einem geringen Abstand begegnet sind.</item> + <item quantity="one">"You have a higher risk of infection because you were last exposed %1$s day ago over a longer period of time and in close proximity to at least one person diagnosed with COVID-19."</item> + <item quantity="other">"You have a higher risk of infection because you were last exposed %1$s days ago over a longer period of time and in close proximity to at least one person diagnosed with COVID-19."</item> </plurals> <!-- YTXT: risk details - risk calculation explanation --> - <string name="risk_details_information_body_notice">Das Infektionsrisiko wird anhand der Daten der Risiko-Ermittlung unter Berücksichtigung von Abstand und Dauer lokal auf Ihrem Smartphone berechnet. Ihr Infektionsrisiko ist für niemanden einsehbar und wird nicht weitergegeben.</string> + <string name="risk_details_information_body_notice">"Your risk of infection is calculated from the exposure logging data (duration and proximity) locally on your device. Your risk of infection cannot be seen by, or passed on to, anyone else."</string> <!-- NOTR --> <string name="risk_details_button_update">@string/risk_card_button_update</string> <!-- NOTR --> <string name="risk_details_button_enable_tracing">@string/risk_card_button_enable_tracing</string> <!-- XACT: risk details page title --> - <string name="risk_details_accessibility_title">Ihr Risikostatus</string> + <string name="risk_details_accessibility_title">"Your Risk Status"</string> <!-- #################################### Onboarding ###################################### --> <!-- XBUT: onboarding - forward and deny --> - <string name="onboarding_button_disable">Nicht aktivieren</string> + <string name="onboarding_button_disable">"Do Not Activate"</string> <!-- XBUT: onboarding - forward and allow --> - <string name="onboarding_button_enable">Aktivieren</string> + <string name="onboarding_button_enable">"Activate"</string> <!-- XBUT: onboarding - back and cancel --> - <string name="onboarding_button_cancel">Abbrechen</string> + <string name="onboarding_button_cancel">"Cancel"</string> <!-- XBUT: onboarding - next --> - <string name="onboarding_button_next">Weiter</string> + <string name="onboarding_button_next">"Next"</string> <!-- XBUT: onboarding - start --> - <string name="onboarding_button_start">Los geht\'s</string> + <string name="onboarding_button_start">"Let’s Get Started"</string> <!-- XTXT: onboarding - back description for screen reader --> - <string name="onboarding_button_back_description">Zurück</string> + <string name="onboarding_button_back_description">"Back"</string> <!-- XACT: Onboarding (together) page title --> - <string name="onboarding_onboarding_accessibility_title">Einführung Seite 1 von 5. Gemeinsam Corona bekämpfen</string> + <string name="onboarding_onboarding_accessibility_title">"Onboarding page 1 of 5: Fighting coronavirus together"</string> <!-- XHED: onboarding(together) - fight corona --> - <string name="onboarding_headline">Gemeinsam Corona bekämpfen</string> + <string name="onboarding_headline">"Let\'s fight coronavirus together"</string> <!-- XHED: onboarding(together) - two/three line headline under an illustration --> - <string name="onboarding_subtitle">Mehr Schutz für Sie und uns alle. Mit der Corona-Warn-App durchbrechen wir Infektionsketten schneller.</string> + <string name="onboarding_subtitle">"More protection for you and for us all. By using the Corona-Warn-App we can break infection chains much quicker."</string> <!-- YTXT: onboarding(together) - inform about the app --> - <string name="onboarding_body">Machen Sie Ihr Smartphone zum Corona-Warn-System. Überblicken Sie Ihren Risikostatus und erfahren Sie, ob in den letzten 14 Tagen infizierte Personen in ihrer Nähe waren.</string> + <string name="onboarding_body">"Turn your device into a coronavirus warning system. Get an overview of your risk status and find out whether you\'ve had close contact with anyone diagnosed with COVID-19 in the last 14 days."</string> <!-- YTXT: onboarding(together) - explain application --> - <string name="onboarding_body_emphasized">Die App merkt sich Begegnungen zwischen Menschen, indem ihre Smartphones verschlüsselte Zufallscodes austauschen. Und zwar ohne dabei auf persönliche Daten zuzugreifen.</string> + <string name="onboarding_body_emphasized">"The app logs exposures between individuals by exchanging encrypted, random IDs between their devices, whereby no personal data whatsoever is accessed."</string> <!-- XACT: onboarding(together) - illustraction description, header image --> - <string name="onboarding_illustration_description">Eine vielfältige Gruppe in einer Stadt benutzt Smartphones.</string> + <string name="onboarding_illustration_description">"A group of people are all using their devices in town."</string> <!-- XACT: Onboarding (privacy) page title --> - <string name="onboarding_privacy_accessibility_title">Einführung Seite 2 von 5. Datenschutz</string> + <string name="onboarding_privacy_accessibility_title">"Onboarding page 2 of 5: Data Privacy. A long text follows. To proceed at any time, use the button at the bottom of the screen."</string> <!-- XHED: onboarding(privacy) - title --> - <string name="onboarding_privacy_headline">Datenschutz</string> + <string name="onboarding_privacy_headline">"Data Privacy"</string> <!-- XACT: onboarding(privacy) - illustraction description, header image --> - <string name="onboarding_privacy_illustration_description">Eine Frau mit einem Handy benutzt die Corona-Warn-App, ein Vorhängeschloss auf einem Schild steht als Symbol für verschlüsselte Daten.</string> + <string name="onboarding_privacy_illustration_description">"One of the women is using the Corona-Warn-App on her device. The padlock on the shield is the symbol for encrypted data."</string> <!-- XACT: Onboarding (tracing) page title --> - <string name="onboarding_tracing_accessibility_title">Einführung Seite 3 von 5. Wie Sie die Risiko Ermittlung ermöglichen</string> + <string name="onboarding_tracing_accessibility_title">"Onboarding page 3 of 5: How to Enable Exposure Logging"</string> <!-- XHED: onboarding(tracing) - how to enable tracing --> - <string name="onboarding_tracing_headline">Wie Sie die Risiko-Ermittlung ermöglichen</string> + <string name="onboarding_tracing_headline">"How to Enable Exposure Logging"</string> <!-- XHED: onboarding(tracing) - two/three line headline under an illustration --> - <string name="onboarding_tracing_subtitle">Um zu erkennen, ob für Sie ein Ansteckungsrisiko vorliegt, müssen Sie die Risiko-Ermittlung aktivieren.</string> + <string name="onboarding_tracing_subtitle">"To identify whether you are at risk of infection, you must activate the exposure logging feature."</string> <!-- YTXT: onboarding(tracing) - explain tracing --> - <string name="onboarding_tracing_body">Die Risiko-Ermittlung funktioniert, indem Ihr Handy per Bluetooth verschlüsselte Zufallscodes anderer Nutzerinnen und Nutzer empfängt und Ihren eigenen Zufallscode an deren Smartphones weitergibt. Die Funktion lässt sich jederzeit wieder deaktivieren.</string> + <string name="onboarding_tracing_body">"Exposure logging works by your device receiving, via Bluetooth, encrypted random IDs of other users and passing your own random ID to their devices. This feature can be deactivated at any time."</string> <!-- YTXT: onboarding(tracing) - explain tracing --> - <string name="onboarding_tracing_body_emphasized">Die verschlüsselten Zufallscodes geben nur Auskunft über das Datum, die Dauer und die anhand der Signalstärke berechnete Entfernung zu Ihren Mitmenschen. Persönliche Daten wie Name, Adresse oder Aufenthaltsort werden zu keiner Zeit erfasst. Konkrete Rückschlüsse auf Personen sind nicht möglich.</string> + <string name="onboarding_tracing_body_emphasized">"The encrypted random IDs only pass information about date, duration and proximity (using signal strength) to other people. Personal data such as name, address, location is never recorded. Individuals cannot be identified."</string> <!-- XHED: onboarding(tracing) - headline for consent information --> - <string name="onboarding_tracing_headline_consent">Einwilligungserklärung</string> + <string name="onboarding_tracing_headline_consent">"Declaration of Consent"</string> <!-- YTXT: onboarding(tracing) - body for consent information --> - <string name="onboarding_tracing_body_consent">Um zu erfahren, ob Sie Kontakt mit einer infizierten Person hatten und für Sie ein Infektionsrisiko besteht, müssen Sie die Funktion Risiko-Ermittlung in der App aktivieren. Der Aktivierung der Risiko-Ermittlung und der damit im Zusammenhang stehenden Datenverarbeitung stimmen Sie mit Antippen des Buttons: Risiko-Ermittlung aktivieren zu.<xliff:g id="line_break">\n</xliff:g><xliff:g id="line_break">\n</xliff:g>Um die Risiko-Ermittlung nutzen zu können müssen Sie zudem auf Ihrem Smartphone die von Google bereitgestellte Kontaktaufzeichnungs-Funktion „Benachrichtigungen zu möglicher Begegnung mit COVID-19-Infizierten“ aktivieren und für die Corona-Warn-App freigeben.<xliff:g id="line_break">\n</xliff:g><xliff:g id="line_break">\n</xliff:g>Ihr Smartphone erzeugt und versendet bei aktivierter Kontaktaufzeichnung kontinuierlich Zufalls-IDs per Bluetooth, die von anderen Apple- und Android-Smartphones mit ebenfalls aktivierter Kontaktaufzeichnung in Ihrer Umgebung empfangen werden können. Umgekehrt empfängt Ihr Smartphone die Zufalls-IDs der anderen Smartphones. Die eigenen und die von anderen Smartphones empfangenen Zufalls-IDs werden im Kontaktprotokoll der Kontaktaufzeichnungs-Funktion aufgezeichnet und dort für 14 Tage gespeichert.<xliff:g id="line_break">\n</xliff:g><xliff:g id="line_break">\n</xliff:g>Zur Ermittlung Ihres Infektionsrisikos lädt die App mehrmals täglich oder auf Abfrage eine Liste mit den Zufalls-IDs aller Nutzer, die Ihre Infektion mit dem Corona-Virus in der App geteilt haben. Diese Liste wird dann mit den im Kontaktprotokoll der Kontaktaufzeichnungs-Funktion gespeicherten Zufalls-IDs verglichen. Wenn die App dabei feststellt, dass Sie möglicherweise Kontakt zu einem infizierten Nutzer gehabt haben, werden Sie von der App informiert, dass Sie mit einer infizierten Person in Kontakt waren und insoweit ein Infektionsrisiko besteht. In diesem Fall erhält die App außerdem Zugriff auf weitere im Kontaktprotokoll der Kontaktaufzeichnungs-Funktion Ihres Smartphones gespeicherte Daten (Datum und Dauer sowie Bluetooth-Signalstärke des Kontakts).<xliff:g id="line_break">\n</xliff:g><xliff:g id="line_break">\n</xliff:g>Aus der Bluetooth-Signalstärke wird der räumliche Abstand abgeleitet (je stärker das Signal, desto geringer der Abstand). Diese Angaben werden von der App ausgewertet, um Ihr Gesundheitsrisiko durch eine Infektion mit dem Corona-Virus abzuschätzen und Ihnen Empfehlungen für die nächsten Schritte zu geben. Diese Auswertung wird ausschließlich lokal auf Ihrem Smartphone durchgeführt. Außer Ihnen erfährt niemand (auch nicht das RKI), ob Sie mit einer infizierten Person Kontakt hatten und welches Risiko für Sie ermittelt wird.<xliff:g id="line_break">\n</xliff:g><xliff:g id="line_break">\n</xliff:g>Zum Widerruf Ihrer Einwilligung in die Risiko-Ermittlung können Sie die Funktion über den Schieberegler innerhalb der App deaktivieren oder die App löschen. Wenn Sie die Risiko-Ermittlung wieder nutzen möchten, können Sie den Schieberegler erneut aktivieren oder die App erneut installieren. Wenn Sie die Risiko-Ermittlung deaktivieren, prüft die App nicht mehr, ob Sie Kontakt zu einem infizierten Nutzer gehabt haben. Um auch die Aussendung und den Empfang der Zufalls-IDs anzuhalten, müssen Sie das Kontaktprotokoll der Kontaktaufzeichnungs-Funktion in den Einstellungen Ihres Smartphones deaktivieren. Bitte beachten Sie, dass die im Kontaktprotokoll aufgezeichneten fremden und eigenen Zufalls-Kennungen nicht in der App gelöscht werden. Die im Kontaktprotokoll gespeicherten Daten können Sie nur in den Einstellungen Ihres Smartphones dauerhaft löschen.<xliff:g id="line_break">\n</xliff:g><xliff:g id="line_break">\n</xliff:g>Die Datenschutzhinweise der App (einschließlich Informationen zur Datenverarbeitung für die Risiko-Ermittlung) finden Sie unter dem Menüpunkt „Datenschutzinformation“.</string> + <string name="onboarding_tracing_body_consent">"To find out whether you have been in contact with an infected person and whether there is a risk that you yourself have been infected, you need to enable the App’s exposure logging feature. By tapping on the “Enable†button, you agree to the enabling of the App’s exposure logging feature and the associated data processing."<xliff:g id="line_break">"\n"</xliff:g><xliff:g id="line_break">"\n"</xliff:g>"In order to use the App’s exposure logging feature, you will have to enable the COVID-19 Exposure Logging functionality provided by Google on your smartphone and grant the Corona-Warn-App permission to use this."<xliff:g id="line_break">"\n"</xliff:g><xliff:g id="line_break">"\n"</xliff:g>"When exposure logging is enabled, your smartphone continuously generates and transmits random IDs via Bluetooth, which other Android or Apple smartphones in your vicinity can receive if exposure logging is also enabled on them. Your smartphone, in turn, receives the random IDs of the other smartphones. Your own random IDs and those received from other smartphones are recorded in the exposure log and stored there for 14 days."<xliff:g id="line_break">"\n"</xliff:g><xliff:g id="line_break">"\n"</xliff:g>"To identify your risk of infection, the App loads a list – several times a day or on request – of the random IDs of all users who have told the App that they have been infected with the coronavirus. This list is then compared with the random IDs stored in the exposure log. If the App detects that you may have been in contact with an infected user, it will inform you of this and tell you that there is a risk that you are also infected. In this case, the App is also given access to other data stored in your smartphone’s exposure log (date, duration and Bluetooth signal strength of the contact)."<xliff:g id="line_break">"\n"</xliff:g><xliff:g id="line_break">"\n"</xliff:g>"The Bluetooth signal strength is used to derive the physical distance (the stronger the signal, the smaller the distance). The App then analyses this information in order to assess your likelihood of having been infected with the coronavirus and to give you recommendations for what to do next. This analysis is only performed locally on your smartphone. Apart from you, nobody (not even the RKI) will know whether you have been in contact with an infected person and what risk has been identified for you."<xliff:g id="line_break">"\n"</xliff:g><xliff:g id="line_break">"\n"</xliff:g>"To withdraw your consent to the exposure logging feature, you can disable the feature using the toggle switch in the App or delete the App. If you decide to use the exposure logging feature again, you can toggle the feature back on or reinstall the App. If you disable the exposure logging feature, the App will no longer check whether you have been in contact with an infected user. If you also wish to stop your device sending and receiving random IDs, you will need to disable COVID-19 Exposure Logging in your smartphone settings. Please note that your own random IDs and those received from other smartphones which are stored in the exposure log will not be deleted in the App. You can only permanently delete the data stored in the exposure log in your smartphone settings."<xliff:g id="line_break">"\n"</xliff:g><xliff:g id="line_break">"\n"</xliff:g>"The App’s privacy notice (including an explanation of the data processing carried out for the exposure logging feature) can be found in the menu under “Data Privacy Informationâ€."</string> <!-- XBUT: onboarding(tracing) - button enable tracing --> - <string name="onboarding_tracing_button_next">Risiko-Ermittlung aktivieren</string> + <string name="onboarding_tracing_button_next">"Activate Exposure Logging"</string> <!-- XTXT: onboarding(tracing) - dialog about tracing permission declined --> - <string name="onboarding_tracing_dialog_headline">Berechtigung</string> + <string name="onboarding_tracing_dialog_headline">"Authorization"</string> <!-- YMSI: onboarding(tracing) - dialog about tracing --> - <string name="onboarding_tracing_dialog_body">Corona-Warn-App kann dadurch keine Benachrichtigungen zum COVID-19-Risikostatus versenden und empfangen. Sie können die Funktion jederzeit ausschalten.</string> + <string name="onboarding_tracing_dialog_body">"This means the Corona-Warn-App cannot send or receive notifications about your COVID-19 risk status. You can deactivate this feature at any time."</string> <!-- XBUT: onboarding(tracing) - positive button (right) --> - <string name="onboarding_tracing_dialog_button_positive">Nicht aktivieren</string> + <string name="onboarding_tracing_dialog_button_positive">"Do Not Activate"</string> <!-- XBUT: onboarding(tracing) - negative button (right) --> - <string name="onboarding_tracing_dialog_button_negative">Zurück</string> + <string name="onboarding_tracing_dialog_button_negative">"Back"</string> <!-- XACT: onboarding(tracing) - illustraction description, header image --> - <string name="onboarding_tracing_illustration_description">Drei Personen haben die Risiko-Erkennung auf ihren Smartphones aktiviert, ihre Begegnung wird daher aufgezeichnet.</string> + <string name="onboarding_tracing_illustration_description">"Three people have activated exposure logging on their devices, which will log their encounters with each other."</string> <!-- XACT: Onboarding (test) page title --> - <string name="onboarding_test_accessibility_title">Einführung Seite 4 von 5. Falls Sie positiv getestet wurden</string> + <string name="onboarding_test_accessibility_title">"Onboarding page 4 of 5: If you are diagnosed with COVID-19..."</string> <!-- XHED: onboarding(test) - about positive tests --> - <string name="onboarding_test_headline">Falls Sie positiv getestet werden …</string> + <string name="onboarding_test_headline">"If you are diagnosed with COVID-19..."</string> <!-- XHED: onboarding(test) - two/three line headline under an illustration --> - <string name="onboarding_test_subtitle">… teilen Sie es bitte über die Corona-Warn-App mit. Freiwillig und sicher. Für die Gesundheit aller.</string> + <string name="onboarding_test_subtitle">"...please report this in the Corona-Warn-App. Sharing your test results is voluntary and secure. Please do this for the sake of everyone\'s health."</string> <!-- YTXT: onboarding(test) - explain test --> - <string name="onboarding_test_body">Ihre Mitteilung wird zuverlässig verschlüsselt über einen sicheren Server weiterverarbeitet. Die Personen, deren verschlüsselte Zufallscodes Sie gesammelt haben, erhalten nun eine Warnung und Informationen darüber, wie sie weiter vorgehen sollen.</string> + <string name="onboarding_test_body">"Your notification is encrypted securely and processed on a secure server. People whose encrypted random IDs your device has collected, will now receive a warning along with information about what they should now do."</string> <!-- XACT: onboarding(test) - illustraction description, header image --> - <string name="onboarding_test_illustration_description">Ein positiver Testbefund wird verschlüsselt ins System übermittelt, das nun andere Nutzerinnen und Nutzer warnt.</string> + <string name="onboarding_test_illustration_description">"An encrypted positive test diagnosis is transmitted to the system, which will now warn other users."</string> <!-- XACT: Onboarding (datashare) page title --> - <string name="onboarding_notifications_accessibility_title">Einführung Seite 5 von 5. Warnungen erhalten und Risiken erkennen</string> + <string name="onboarding_notifications_accessibility_title">"Onboarding page 5 of 5: Receive warnings and identify risks"</string> <!-- XHED: onboarding(datashare) - about positive tests --> - <string name="onboarding_notifications_headline">Warnungen erhalten, Risiken erkennen</string> + <string name="onboarding_notifications_headline">"Receive warnings and identify risks"</string> <!-- XHED: onboarding(datashare) - two/three line headline under an illustration --> - <string name="onboarding_notifications_subtitle">Die App kann Sie automatisch über Ihren Risikostatus informieren und bei Neuinfektionen von Menschen, denen Sie begegnet sind, warnen. Erlauben Sie der App jetzt, Sie zu benachrichtigen.</string> + <string name="onboarding_notifications_subtitle">"The app can notify you automatically about your risk status and warn you about new infections of people you have been exposed to. Allow the app now to notify you."</string> <!-- YTXT: onboarding(datashare) - explain test --> - <string name="onboarding_notifications_body">Auf diese Weise können Sie sich zum Schutz Ihrer Mitmenschen in Isolation begeben und nach entsprechender Abklärung testen lassen.</string> + <string name="onboarding_notifications_body">"You can then self-isolate to protect others and find out where you can get tested."</string> <!-- XACT: onboarding(notifications) - illustraction description, header image --> - <string name="onboarding_notifications_illustration_description">Eine Frau erhält eine Benachrichtigung von ihrer Corona-Warn-App.</string> + <string name="onboarding_notifications_illustration_description">"One woman receives a notification from her Corona-Warn-App."</string> <!-- #################################### Settings ###################################### --> <!-- XHED: settings - settings overview page title --> - <string name="settings_title">Einstellungen</string> + <string name="settings_title">"Settings"</string> <!-- XTXT: settings - on, like a label next to a setting --> - <string name="settings_on">An</string> + <string name="settings_on">"On"</string> <!-- XTXT: settings - off, like a label next to a setting --> - <string name="settings_off">Aus</string> + <string name="settings_off">"Off"</string> <!-- XHED: settings(tracing) - page title --> - <string name="settings_tracing_title">Risiko-Ermittlung</string> + <string name="settings_tracing_title">"Exposure Logging"</string> <!-- XHED: settings(tracing) - headline bellow illustration --> - <string name="settings_tracing_headline">So funktioniert die Aufzeichnung Ihrer Begegnungen</string> + <string name="settings_tracing_headline">"This is how exposure logging works"</string> <!-- XTXT: settings(tracing) - explain text in settings overview under headline --> - <string name="settings_tracing_body_description">Erlauben Sie die Aufzeichnung und Weitergabe von Zufallcodes.</string> + <string name="settings_tracing_body_description">"Allow COVID-19 random IDs to be generated and shared."</string> <!-- XTXT: settings(tracing) - shows status under header in home, active --> - <string name="settings_tracing_body_active">Risiko-Ermittlung aktiv</string> + <string name="settings_tracing_body_active">"Exposure logging active"</string> <!-- XTXT: settings(tracing) - shows status under header in home, inactive --> - <string name="settings_tracing_body_inactive">Risiko-Ermittlung gestoppt</string> + <string name="settings_tracing_body_inactive">"Exposure logging stopped"</string> <!-- YTXT: settings(tracing) - explains tracings --> - <string name="settings_tracing_body_text">Um zu erkennen, ob für Sie ein Ansteckungsrisiko vorliegt, müssen Sie die Risiko-Ermittlung aktivieren. Die Risiko- Ermittlung funktioniert, indem Ihr Handy per Bluetooth verschlüsselte Zufallscodes anderer Nutzerinnen und Nutzer empfängt und Ihren eigenen Zufallscode an deren Smartphones weitergibt. Die Funktion lässt sich jederzeit wieder deaktivieren.<xliff:g id="line_break">\n</xliff:g><xliff:g id="line_break">\n</xliff:g>Die verschlüsselten Zufallscodes geben nur Auskunft über das Datum, die Dauer und die anhand der Signalstärke berechnete Entfernung zu Ihren Mitmenschen. Persönliche Daten wie Name, Adresse oder Aufenthaltsort werden zu keiner Zeit erfasst. Konkrete Rückschlüsse auf Personen sind nicht möglich.</string> + <string name="settings_tracing_body_text">"Exposure logging works by your device receiving, via Bluetooth, encrypted random IDs of other users and passing your random ID to their devices. This feature can be deactivated at any time. "<xliff:g id="line_break">"\n"</xliff:g><xliff:g id="line_break">"\n"</xliff:g>"Encrypted random IDs only pass information about date, duration, and proximity (calculated using signal strength) to other people. Personal data such as name, address, and location is never recorded. Individuals cannot be identified."</string> <!-- XTXT: settings(tracing) - status next to switch under title --> - <string name="settings_tracing_status_active">Aktiv</string> + <string name="settings_tracing_status_active">"Active"</string> <!-- XTXT: settings(tracing) - status next to switch under title --> - <string name="settings_tracing_status_inactive">Gestoppt</string> + <string name="settings_tracing_status_inactive">"Stopped"</string> <!-- XTXT: settings(tracing) - status next to switch under title --> - <string name="settings_tracing_status_restricted">Eingeschränkt</string> + <string name="settings_tracing_status_restricted">"Restricted"</string> <!-- XTXT: settings(tracing) - shows status under header in home, no internet --> - <string name="settings_tracing_body_connection_inactive">Keine Internetverbindung</string> + <string name="settings_tracing_body_connection_inactive">"No Internet connection"</string> <!-- XTXT: settings(tracing) - shows status under header in home, no bluetooth --> - <string name="settings_tracing_body_bluetooth_inactive">Bluetooth deaktiviert</string> + <string name="settings_tracing_body_bluetooth_inactive">"Bluetooth turned off"</string> <!--XHED : settings(tracing) - headline on card about the current status and what to do --> - <string name="settings_tracing_status_bluetooth_headline">Bluetooth aktivieren</string> + <string name="settings_tracing_status_bluetooth_headline">"Turn on Bluetooth"</string> <!-- XTXT: settings(tracing) - explains user what to do on card if bluetooth is disabled --> - <string name="settings_tracing_status_bluetooth_body">Die Risiko-Ermittlung benötigt aktiviertes Bluetooth, um Begegnungen aufzuzeichnen. Bitte aktivieren Sie Bluetooth in Ihren Geräte-Einstellungen.</string> + <string name="settings_tracing_status_bluetooth_body">"Bluetooth must be turned on for exposure logging in order to log encounters. Please turn on Bluetooth in your device settings."</string> <!-- XBUT: settings(tracing) - go to operating system settings button on card --> - <string name="settings_tracing_status_bluetooth_button">Geräte-Einstellungen öffnen</string> + <string name="settings_tracing_status_bluetooth_button">"Open Device Settings"</string> <!--XHED : settings(tracing) - headline on card about the current status and what to do --> - <string name="settings_tracing_status_connection_headline">Internetverbindung herstellen</string> + <string name="settings_tracing_status_connection_headline">"Open Internet connection"</string> <!-- XTXT: settings(tracing) - explains user what to do on card if connection is disabled --> - <string name="settings_tracing_status_connection_body">Die Risiko-Ermittlung benötigt eine Internetverbindung, um Risiko-Begegnungen berechnen zu können. Bitte aktivieren Sie WLAN oder mobile Daten in Ihren Geräte-Einstellungen.</string> + <string name="settings_tracing_status_connection_body">"Exposure logging requires an Internet connection to calculate exposures. Please turn on WIFI or mobile data in your device settings."</string> <!-- XBUT: settings(tracing) - go to operating system settings button on card --> - <string name="settings_tracing_status_connection_button">Geräte-Einstellungen öffnen</string> + <string name="settings_tracing_status_connection_button">"Open Device Settings"</string> <!-- XTXT: settings(tracing) - explains the circle progress indicator to the right with the current value --> <plurals name="settings_tracing_status_body_active"> - <item quantity="one">Die Risiko-Ermittlung ist seit insgesamt einem Tag aktiv. Eine verlässliche Risiko-Ãœberprüfung kann nur mit einer dauerhaft aktivierten Risiko-Ermittlung erfolgen.</item> - <item quantity="other">Die Risiko-Ermittlung ist seit insgesamt %1$s Tagen aktiv. Eine verlässliche Risiko-Ãœberprüfung kann nur mit einer dauerhaft aktivierten Risiko-Ermittlung erfolgen.</item> + <item quantity="one">"Exposure logging has been active for one day.\nAn exposure check can only be reliable if exposure logging is permanently activated."</item> + <item quantity="other">"Exposure logging has been active for %1$s days.\nAn exposure check can only be reliable if exposure logging is permanently activated."</item> </plurals> <!-- XACT: settings(tracing) - describes illustration --> - <string name="settings_tracing_illustration_description_active">Drei Personen haben die Risiko-Erkennung auf ihren Smartphones aktiviert, ihre Begegnung wird daher aufgezeichnet.</string> + <string name="settings_tracing_illustration_description_active">"Three people have activated exposure logging on their devices, which will log their encounters with each other."</string> <!-- XACT: settings(tracing) - describes illustration --> - <string name="settings_tracing_illustration_description_inactive">Eine Person hat die Risiko-Erkennung auf ihrem Smartphone ausgeschaltet, eine Begegnung mit zwei weiteren Personen wird daher nicht aufgezeichnet. </string> + <string name="settings_tracing_illustration_description_inactive">"One person has deactivated exposure logging on their device, so an encounter with two other people is not logged."</string> <!-- XACT: settings(tracing) - describes illustration --> - <string name="settings_tracing_bluetooth_illustration_description_inactive">Eine Person hat Bluetooth auf ihrem Smartphone ausgeschaltet, eine Begegnung mit zwei weiteren Personen wird daher nicht aufgezeichnet.</string> + <string name="settings_tracing_bluetooth_illustration_description_inactive">"One person has turned off Bluetooth on their device, so an encounter with two other people is not logged."</string> <!-- XACT: settings(tracing) - describes illustration --> - <string name="settings_tracing_connection_illustration_description_inactive">Eine Person hat die Internetverbindung ihres Smartphones ausgeschaltet, eine Begegnung mit zwei weiteren Personen wird daher nicht aufgezeichnet.</string> + <string name="settings_tracing_connection_illustration_description_inactive">"One person has turned off the Internet connection on their device, so an encounter with two other people is not logged."</string> <!-- XHED: settings(notification) - notification page title --> - <string name="settings_notifications_title">Benachrichtigungen</string> + <string name="settings_notifications_title">"Notifications"</string> <!-- XHED: settings(notification) - multiline headline below illustration, active --> - <string name="settings_notifications_headline_active">Möchten Sie Benachrichtigungen zu Ihrem COVID-19-Risikostatus aktivieren?</string> + <string name="settings_notifications_headline_active">"Do you want to activate notifications of your COVID-19 risk status?"</string> <!-- XHED: settings(notification) - multiline headline below illustration, inactive --> - <string name="settings_notifications_headline_inactive">Benachrichtigungen sind ausgestellt</string> + <string name="settings_notifications_headline_inactive">"Notifications are deactivated"</string> <!-- XTXT: settings(notification) - text in row on settings overview --> - <string name="settings_notifications_body_description">Erlauben Sie automatische Benachrichtigungen zu COVID-19-Risikostatus.</string> + <string name="settings_notifications_body_description">"Allow automatic notifications of COVID-19 risk status"</string> <!-- YTXT: settings(notification) - description text when it notifications are enabled --> - <string name="settings_notifications_body_active">Legen Sie fest, zu welchen Themen Sie informiert beiben möchten.</string> + <string name="settings_notifications_body_active">"Specify which areas you want to continue to receive notifications for."</string> <!-- XTXT: settings(notification) - explains what the user has to do to activate settings --> - <string name="settings_notifications_body_inactive">Um Benachrichtigungen zu aktivieren, müssen Sie Benachrichtigungen für die Corona-Warn-App in Ihren Geräte-Einstellungen zulassen.</string> + <string name="settings_notifications_body_inactive">"To activate notifications, you must allow notifications for the Corona-Warn-App in your device settings."</string> <!-- XHED: settings(notification) - card headline --> - <string name="settings_notifications_headline_card">Mitteilungen aktivieren</string> + <string name="settings_notifications_headline_card">"Activate Notifications"</string> <!-- XHED: settings - notification headline on settings overview --> - <string name="settings_notifications_subtitle_notification">Benachrichtigungen</string> + <string name="settings_notifications_subtitle_notification">"Notifications"</string> <!-- XTXT: settings(notification) - next to a switch --> - <string name="settings_notifications_subtitle_update_risk">Änderungen Ihres Infektionsrisikos</string> + <string name="settings_notifications_subtitle_update_risk">"Your risk of infection changed"</string> <!-- XTXT: settings(notification) - next to a switch --> - <string name="settings_notifications_subtitle_update_test">Status Ihres COVID-19-Tests</string> + <string name="settings_notifications_subtitle_update_test">"Status of your COVID-19 test"</string> <!-- XBUT: settings(notification) - go to operating settings --> - <string name="settings_notifications_button_open_settings">Geräte-Einstellungen öffnen</string> + <string name="settings_notifications_button_open_settings">"Open Device Settings"</string> <!-- XACT: main (overview) - illustraction description, explanation image, displays notificatin status, active --> - <string name="settings_notifications_illustration_description_active">Eine Frau erhält eine Mitteilung von ihrer Corona-Warn-App.</string> + <string name="settings_notifications_illustration_description_active">"One woman receives a notification from her Corona-Warn-App."</string> <!-- XACT: main (overview) - illustraction description, explanation image, displays notificatin status, inactive --> - <string name="settings_notifications_illustration_description_inactive">Eine Frau hat die Mitteilungen ihrer Corona-Warn-App ausgeschaltet.</string> + <string name="settings_notifications_illustration_description_inactive">"One woman has deactivated notifications for her Corona-Warn-App."</string> <!-- XBUT: settings - go to reset application --> - <string name="settings_reset_title">Anwendung zurücksetzen</string> + <string name="settings_reset_title">"Reset App"</string> <!-- XTXT: settings(reset) - explains the user what do expect when he navigates to reset --> - <string name="settings_reset_body_description">Löschen Sie alle Ihre Daten in der App.</string> + <string name="settings_reset_body_description">"Delete all your data in the app."</string> <!-- XHED: settings(reset) - multiline headline below illustration --> - <string name="settings_reset_headline">Sind Sie sicher, dass Sie die Anwendung zurücksetzen wollen?</string> + <string name="settings_reset_headline">"Are you sure you want to reset the app?"</string> <!-- XTXT: settings(reset) - explains the consequences --> - <string name="settings_reset_body">Sie werden nicht mehr über Ihre Risiko-Begegnungen informiert und können andere Nutzerinnen und Nutzer nicht mehr warnen.</string> + <string name="settings_reset_body">"You will no longer be notified of your exposures and you will no longer be able to warn other users."</string> <!-- XHED: settings(reset) - on card, explains user to go to the operating system settings --> - <string name="settings_reset_headline_keys">Begegnungs-<xliff:g id="line_break">\n</xliff:g>Aufzeichnungen löschen</string> + <string name="settings_reset_headline_keys">"Delete Exposure "<xliff:g id="line_break">"\n"</xliff:g>"Log"</string> <!-- XTXT: settings(reset) - on card --> - <string name="settings_reset_body_keys">Die Begegnungs-Aufzeichnung muss separat in den Geräte Einstellungen gelöscht werden.</string> + <string name="settings_reset_body_keys">"The exposure log must be deleted separately in your device settings."</string> <!-- XBUT: settings(reset) - triggers reset --> - <string name="settings_reset_button_positive">Anwendung zurücksetzen</string> + <string name="settings_reset_button_positive">"Reset App"</string> <!-- XBUT: settings(reset) - cancel reset and navigates the suer back to the settings --> - <string name="settings_reset_button_negative">Abbrechen</string> + <string name="settings_reset_button_negative">"Cancel"</string> <!-- XACT: main (overview) - illustraction description, explanation image --> - <string name="settings_reset_illustration_description">Eine Hand hält ein Smartphone, auf dem das Zurücksetzen der Anwendung symbolisiert wird.</string> - + <string name="settings_reset_illustration_description">"One person is holding a device displaying a symbol indicating that the app is being reset."</string> + <!-- XHED: settings(reset) - dialog headline --> + <string name="settings_reset_dialog_headline">"Reset App"</string> + <!-- XTXT: settings(reset) - dialog content --> + <string name="settings_reset_dialog_body">"You will no longer be notified of your exposures and you will no longer be able to warn other users. This procedure cannot be undone."</string> + <!-- XBUT: settings(reset) - dialog cancel --> + <string name="settings_reset_dialog_button_cancel">"Cancel"</string> + <!-- XBUT: settings(reset) - dialog confirm --> + <string name="settings_reset_dialog_button_confirm">"Reset"</string> <!-- #################################### App Information ###################################### --> <!-- XHED: Page title for menu information page --> - <string name="information_title">App-Informationen</string> + <string name="information_title">"App Information"</string> <!-- XTXT: Version information text --> - <string name="information_version">Version: %1s</string> + <string name="information_version">"Version: %1s"</string> <!-- XHED: Page title for about information page, also menu item / button text --> - <string name="information_about_title">Ãœber die App</string> + <string name="information_about_title">"About the App"</string> <!-- XHED: Subtitle for about information page --> - <string name="information_about_headline">Gemeinsam Corona bekämpfen</string> + <string name="information_about_headline">"Let\'s fight coronavirus together"</string> <!-- YTXT: Body text for about information page --> - <string name="information_about_body_emphasized">Das Robert Koch-Institut (RKI) als zentrale Einrichtung des Bundes im Bereich der Öffentlichen Gesundheit und als nationalesPublic-Health-Institut veröffentlicht die Corona-Warn-App für die gesamte Bundesregierung. Die App ist die digitale Ergänzung zu Abstandhalten, Hygiene und Alltagsmaske.</string> + <string name="information_about_body_emphasized">"The Robert Koch Institute (RKI) is Germany’s central body for the Federal States of Germany in the field of public health. The RKI is publishing the Corona-Warn-App for the federal government. The app represents the digital extension to the public health measures already introduced: social distancing, hygiene behavior, and face masks."</string> <!-- YTXT: Body text for about information page --> - <string name="information_about_body">Wer sie nutzt, hilft, Infektionsketten schnell nachzuverfolgen und zu durchbrechen. Die App speichert dezentral – auf Ihrem Smartphone – Begegnungen mit anderen.Sie werden informiert, wenn Sie Kontakt mit nachweislich infizierten Personen hatten.Ihre Privatsphärebleibt dabeibestens geschützt.</string> + <string name="information_about_body">"Whoever uses the app helps to trace and break chains of infection. The app saves encounters with other people locally on your device. You are notified if you have encountered people who were later diagnosed with COVID-19. Your identity and privacy are always protected."</string> <!-- XACT: describes illustration --> - <string name="information_about_illustration_description">Eine vielfältige Gruppe in einer Stadt benutzt Smartphones.</string> + <string name="information_about_illustration_description">"A group of people are all using their devices in town."</string> <!-- XHED: Page title for privacy information page, also menu item / button text --> - <string name="information_privacy_title">Datenschutzinformation</string> + <string name="information_privacy_title">"Data Privacy Information"</string> <!-- XACT: describes illustration --> - <string name="information_privacy_illustration_description">Eine Frau mit einem Handy benutzt die Corona-Warn-App, ein Vorhängeschloss auf einem Schild steht als Symbol für verschlüsselte Daten.</string> + <string name="information_privacy_illustration_description">"One of the women is using the Corona-Warn-App on her device. The padlock on the shield is the symbol for encrypted data."</string> <!-- XTXT: Path to the full blown privacy html, to translate it exchange "_de" to "_en" and provide the corresponding html file --> - <string name="information_privacy_html_path">privacy_de.html</string> + <string name="information_privacy_html_path">"privacy_en.html"</string> <!-- XHED: Page title for terms of use information page, also menu item / button text --> - <string name="information_terms_title">Nutzungsbedingungen</string> + <string name="information_terms_title">"Terms of Use"</string> <!-- XHED: Page headline for terms of use information page --> - <string name="information_terms_headline">Inhalt</string> + <string name="information_terms_headline">"Content"</string> <!-- XACT: describes illustration --> - <string name="information_terms_illustration_description">Eine Hand hält ein Smartphone mit viel Text, daneben ist ein Haken als Symbol für akzeptierte Nutzungsbedingungen.</string> + <string name="information_terms_illustration_description">"One person is holding a device with a lot of text on the screen. Next to the text is a tick, which is the symbol for accepting the terms of use."</string> <!-- XTXT: Path to the full blown terms html, to translate it exchange "_de" to "_en" and provide the corresponding html file --> - <string name="information_terms_html_path">terms_de.html</string> + <string name="information_terms_html_path">"terms_en.html"</string> <!-- XHED: Page title for technical contact and hotline information page, also menu item / button text --> - <string name="information_contact_title">Technische Hotline</string> + <string name="information_contact_title">"Technical Hotline"</string> <!-- XHED: Subtitle for technical contact and hotline information page --> - <string name="information_contact_headline">Wie können wir Ihnen helfen?</string> + <string name="information_contact_headline">"How can we help you?"</string> <!-- YTXT: Body text for technical contact and hotline information page --> - <string name="information_contact_body">Für technische Fragen rund um die Corona-Warn-App können Sie sich direkt an unsere technische Hotline wenden.</string> + <string name="information_contact_body">"For technical questions about the Corona-Warn-App, please contact our hotline."</string> <!-- XHED: Subtitle for technical contact and hotline information page --> - <string name="information_contact_subtitle_phone">Technische Hotline:</string> + <string name="information_contact_subtitle_phone">"Technical hotline:"</string> <!-- XLNK: Button / hyperlink to phone call for technical contact and hotline information page --> - <string name="information_contact_button_phone">+49 (0)800 7540001</string> - <!-- XBUT: CAUTION - ONLY UPDATE THE NUMBER IF NEEDED, ONLY NUMBERS AND NO SPECIAL CHARACTERS EXCEPT "+" and "space" ALLOWED IN THIS FIELD; todo phone number to be called replace in english file --> - <string name="information_contact_phone_call_number">+49 800 7540001</string> + <string name="information_contact_button_phone">"+49 800 7540001"</string> + <!-- XBUT: CAUTION - ONLY UPDATE THE NUMBER IF NEEDED, ONLY NUMBERS AND NO SPECIAL CHARACTERS EXCEPT "+" and "space" ALLOWED IN THIS FIELD; --> + <string name="information_contact_phone_call_number">"+49 800 7540001"</string> <!-- XTXT: Body text for technical contact and hotline information page --> - <string name="information_contact_body_phone">Unser Kundenservice ist für Sie da.</string> + <string name="information_contact_body_phone">"Our customer service is here to help."</string> <!-- YTXT: Body text for technical contact and hotline information page --> - <string name="information_contact_body_open">Unsere Öffnungszeiten:<xliff:g id="line_break">\n</xliff:g>Mo – Fr: 08:00 – 22:00 Uhr<xliff:g id="line_break">\n</xliff:g>Sa – So: 10:00 – 22:00 Uhr<xliff:g id="line_break">\n</xliff:g>Es gelten die Preise Ihres Telefonanbieters.</string> + <string name="information_contact_body_open">"Languages: German, English\nBusiness hours:"<xliff:g id="line_break">"\n"</xliff:g>"Monday to Saturday: 7am - 10pm"<xliff:g id="line_break">"\n(except national holidays)"</xliff:g><xliff:g id="line_break">"\nThe call is free of charge."</xliff:g></string> <!-- YTXT: Body text for technical contact and hotline information page --> - <string name="information_contact_body_other">Für gesundheitliche Fragen, wenden Sie sich bitte an Ihre Hausarztpraxis oder die Hotline des ärztlichen Bereitschaftsdienstes 116 117.</string> + <string name="information_contact_body_other">"If you have any health-related questions, please contact your general practitioner or the hotline for the medical emergency service, telephone: +49 6251 / 708-1082, telefax: +49 116 / 78117."</string> <!-- XACT: describes illustration --> - <string name="information_contact_illustration_description">Ein Mann nutzt ein Headset zum Telefonieren.</string> + <string name="information_contact_illustration_description">"One man is wearing a headset while he is telephoning."</string> <!-- XLNK: Menu item / hyper link / button text for navigation to FAQ website --> - <string name="information_help_title">Häufige Fragen</string> + <string name="information_help_title">"FAQ"</string> + <!-- XACT: accessibility hint --> + <string name="information_help_title_accessibility">"FAQ. Open external link."</string> <!-- XHED: Page title for technical information page, also menu item / button text --> - <string name="information_technical_title">Rechtliche Hinweise</string> + <string name="information_technical_title">"Legal Notices"</string> <!-- XACT: describes illustration --> - <string name="information_technical_illustration_description">Eine Hand hält ein Smartphone mit viel Text, daneben ist eine Balkenwaage als Symbol für rechtliche Hinweise.</string> + <string name="information_technical_illustration_description">"One person is holding a device with a lot of text on the screen. Next to the text is a balance scale, which is the symbol for legal notices"</string> <!-- XTXT: Path to the full blown legal html, to translate it exchange "_de" to "_en" and provide the corresponding html file --> - <string name="information_technical_html_path">technical_de.html</string> + <string name="information_technical_html_path">"technical_en.html"</string> <!-- XHED: Page title for legal information page, also menu item / button text --> - <string name="information_legal_title">Impressum</string> + <string name="information_legal_title">"Publication Details"</string> <!-- XHED: Headline for legal information page, publisher section --> - <string name="information_legal_headline_publisher">Herausgeber</string> + <string name="information_legal_headline_publisher">"Published by"</string> <!-- YTXT: subtitle for legal information page, publisher section --> - <string name="information_legal_subtitle_publisher">(verantwortlich nach § 5 Abs. 1 TMG, § 55 Abs. 1 RStV, DS-GVO, BDSG)</string> + <string name="information_legal_subtitle_publisher">"(responsible according to § 5, Paragraph 1 TMG, § 55 Paragraph 1 RStV, DS-GVO, BDSG)"</string> <!-- YTXT: body for legal information page, publisher section --> - <string name="information_legal_body_publisher">Robert Koch-Institut<xliff:g id="line_break">\n</xliff:g>Nordufer 20<xliff:g id="line_break">\n</xliff:g>13353 Berlin<xliff:g id="line_break">\n</xliff:g><xliff:g id="line_break">\n</xliff:g>vertreten durch den Präsidenten</string> + <string name="information_legal_body_publisher">"Robert Koch Institute"<xliff:g id="line_break">"\n"</xliff:g>"Nordufer 20"<xliff:g id="line_break">"\n"</xliff:g>"13353 Berlin"<xliff:g id="line_break">"\n"</xliff:g><xliff:g id="line_break">"\n"</xliff:g>"vertreten durch den Präsidenten"</string> <!-- XHED: Headline for legal information page, contact section --> - <string name="information_legal_headline_contact">Kontakt</string> + <string name="information_legal_headline_contact">"Contact"</string> <!-- YTXT: subtitle for legal information page, contact section --> - <string name="information_legal_subtitle_contact">E-Mail: CoronaWarnApp@rki.de<xliff:g id="line_break">\n</xliff:g>Telefon: 030 18754 – 5100</string> + <string name="information_legal_subtitle_contact">"E-Mail: CoronaWarnApp@rki.de"<xliff:g id="line_break">"\n"</xliff:g>"Telefon: +49 30 18754 5100"</string> <!-- XHED: Headline for legal information page, tax section --> - <string name="information_legal_headline_taxid">Umsatzsteueridentifikationsnummer</string> + <string name="information_legal_headline_taxid">"VAT identification number"</string> <!-- YTXT: subtitle for legal information page, tax section --> - <string name="information_legal_subtitle_taxid">DE 165 893 430</string> + <string name="information_legal_subtitle_taxid">"DE 165 893 430"</string> <!-- XACT: describes illustration --> - <string name="information_legal_illustration_description">Eine Hand hält ein Smartphone mit viel Text, daneben ist ein Paragraphenzeichen als Symbol für das Impressum.</string> + <string name="information_legal_illustration_description">"One person is holding a device with a lot of text on the screen. Next to the text is a paragraph symbol for the publication details."</string> <!-- #################################### @@ -653,400 +595,413 @@ ###################################### --> <!-- XHED: Dialog title for generic web request error --> - <string name="submission_error_dialog_web_generic_error_title">Fehler</string> + <string name="submission_error_dialog_web_generic_error_title">"Error"</string> <!-- XMSG: Dialog body for generic web request network error with status code --> - <string name="submission_error_dialog_web_generic_network_error_body">Es ist ein Verbindungsfehler aufgetreten (%1$d). Bitte versuchen Sie es erneut.</string> + <string name="submission_error_dialog_web_generic_network_error_body">"Connection could not be established (%1$d). Please try again."</string> <!-- XMSG: Dialog body for generic web request error without status code --> - <string name="submission_error_dialog_web_generic_error_body">Es ist ein Verbindungsfehler aufgetreten. Bitte versuchen Sie es erneut.</string> + <string name="submission_error_dialog_web_generic_error_body">"Connection could not be established. Please try again. "</string> <!-- XBUT: Positive button for generic web request error --> - <string name="submission_error_dialog_web_generic_error_button_positive">Zurück</string> + <string name="submission_error_dialog_web_generic_error_button_positive">"Back"</string> <!-- XHED: Dialog title for already paired test error --> - <string name="submission_error_dialog_web_test_paired_title">Fehler</string> + <string name="submission_error_dialog_web_test_paired_title">"Error"</string> <!-- XMSG: Dialog body for already paired test error --> - <string name="submission_error_dialog_web_test_paired_body">Der QR-Code / Die TAN ist ungültig oder wurde schon verwendet. Bitte versuchen Sie es erneut oder kontaktieren Sie die technische Hotline über App-Informationen → Kontakt.</string> + <string name="submission_error_dialog_web_test_paired_body">"The QR code/TAN is invalid or has been used already. Please try again or contact the technical hotline via App Information -> Technical Hotline."</string> <!-- XBUT: Positive button for already paired test error --> - <string name="submission_error_dialog_web_test_paired_button_positive">Zurück</string> + <string name="submission_error_dialog_web_test_paired_button_positive">"Back"</string> <!-- XHED: Dialog title for could not create submission tan --> - <string name="submission_error_dialog_web_paring_invalid_title">Fehler</string> + <string name="submission_error_dialog_web_paring_invalid_title">"Error"</string> <!-- XMSG: Dialog body for could not create submission tan --> - <string name="submission_error_dialog_web_paring_invalid_body">Es konnte keine Ãœbermittlungs-TAN erstellt werden. Bitte kontaktieren Sie die technische Hotline über App-Informationen → Kontakt.</string> + <string name="submission_error_dialog_web_paring_invalid_body">"A TAN for submission could not be generated. Please contact the technical hotline via App Information → Technical Hotline."</string> <!-- XBUT: Positive button for could not create submission tan --> - <string name="submission_error_dialog_web_paring_invalid_button_positive">Zurück</string> + <string name="submission_error_dialog_web_paring_invalid_button_positive">"Back"</string> <!-- XHED: Dialog title for submission tan invalid --> - <string name="submission_error_dialog_web_tan_invalid_title">Fehler</string> + <string name="submission_error_dialog_web_tan_invalid_title">"Error"</string> <!-- XMSG: Dialog body for submission tan invalid --> - <string name="submission_error_dialog_web_tan_invalid_body">Es konnte keine Ãœbermittlungs-TAN erstellt werden. Bitte kontaktieren Sie die technische Hotline über App-Informationen → Kontakt.</string> + <string name="submission_error_dialog_web_tan_invalid_body">"A TAN for submission could not be generated. Please contact the technical hotline via App Information → Technical Hotline."</string> <!-- XBUT: Positive button for submission tan invalid --> - <string name="submission_error_dialog_web_tan_invalid_button_positive">Zurück</string> + <string name="submission_error_dialog_web_tan_invalid_button_positive">"Back"</string> <!-- Permission Rationale Dialog --> <!-- XHED: Dialog headline QR Scan permission rationale --> - <string name="submission_qr_code_scan_permission_rationale_dialog_headline">Kamera Zugriff benötigt</string> + <string name="submission_qr_code_scan_permission_rationale_dialog_headline">"Camera authorization required"</string> <!-- YTXT: Dialog Body text for QR Scan permission rationale --> - <string name="submission_qr_code_scan_permission_rationale_dialog_body">Für die Erfassung des QR-Codes wird der Zugriff auf die Kamera benötigt.</string> + <string name="submission_qr_code_scan_permission_rationale_dialog_body">"Allow the app to use the camera to scan the QR code."</string> <!-- XBUT: Dialog(QR Scan permission rationale) - positive button (right) --> - <string name="submission_qr_code_scan_permission_rationale_dialog_button_positive">Erlauben</string> + <string name="submission_qr_code_scan_permission_rationale_dialog_button_positive">"Allow"</string> <!-- XBUT: Dialog(QR Scan permission rationale) - negative button (left) --> - <string name="submission_qr_code_scan_permission_rationale_dialog_button_negative">Nicht erlauben</string> + <string name="submission_qr_code_scan_permission_rationale_dialog_button_negative">"Do Not Allow"</string> + + <!-- Permission Denied Dialog --> + <!-- XHED: Dialog headline QR Scan permission denied --> + <string name="submission_qr_code_scan_permission_denied_dialog_headline">"Camera access needed"</string> + <!-- YTXT: Dialog Body text for QR Scan permission denied --> + <string name="submission_qr_code_scan_permission_denied_dialog_body">"Please call up the system settings and allow the app to use the camera to scan the QR code."</string> + <!-- XBUT: Dialog(QR Scan permission denied) - button --> + <string name="submission_qr_code_scan_permission_denied_dialog_button">"OK"</string> <!-- QR Code Scan Invalid Dialog --> <!-- XHED: Dialog headline for invalid QR code --> - <string name="submission_qr_code_scan_invalid_dialog_headline">QR-Code nicht korrekt</string> + <string name="submission_qr_code_scan_invalid_dialog_headline">"Incorrect QR code"</string> <!-- YTXT: Dialog Body text for invalid QR code --> - <string name="submission_qr_code_scan_invalid_dialog_body">Der QR-Code ist nicht korrekt. Bitte versuchen Sie es erneut.</string> + <string name="submission_qr_code_scan_invalid_dialog_body">"The QR code is not correct. Please try again."</string> <!-- XBUT: Dialog(Invalid QR code) - positive button (right) --> - <string name="submission_qr_code_scan_invalid_dialog_button_positive">Erneut versuchen</string> + <string name="submission_qr_code_scan_invalid_dialog_button_positive">"Please try again."</string> <!-- XBUT: Dialog(Invalid QR code) - negative button (left) --> - <string name="submission_qr_code_scan_invalid_dialog_button_negative">Abbrechen</string> + <string name="submission_qr_code_scan_invalid_dialog_button_negative">"Cancel"</string> <!-- QR Code Scan Screen --> + <string name="submission_qr_code_scan_title">"Position the QR code in the frame."</string> <!-- YTXT: instruction text for QR code scanning --> - <string name="submission_qr_code_scan_body">Positionieren Sie den QR Code in den Rahmen</string> + <string name="submission_qr_code_scan_body">"Position the QR code in the frame."</string> <!-- Submission Test Result --> <!-- XHED: Page headline for test result --> - <string name="submission_test_result_headline">Test-Ergebnis</string> + <string name="submission_test_result_headline">"Test Result"</string> <!-- XHED: Page subheadline for test result --> - <string name="submission_test_result_subtitle">Info zum Ablauf:</string> + <string name="submission_test_result_subtitle">"How this works:"</string> <!-- XHED: Page headline for results next steps --> - <string name="submission_test_result_steps_added_heading">Test erfolgreich hinzugefügt</string> + <string name="submission_test_result_steps_added_heading">"Test added successfully"</string> <!-- YTXT: Body text for for results next steps --> - <string name="submission_test_result_steps_added_body">Ihr Test wurde in der Corona-Warn-App hinterlegt.</string> + <string name="submission_test_result_steps_added_body">"Your test has been stored in the Corona-Warn-App."</string> <!-- XHED: Page headline for pending test result next steps --> - <string name="submission_test_result_pending_steps_waiting_heading">Test-Ergebnis noch nicht verfügbar</string> + <string name="submission_test_result_pending_steps_waiting_heading">"Test result is not yet available"</string> <!-- YTXT: Body text for next steps section of waiting test result page --> - <string name="submission_test_result_pending_steps_waiting_body">Ihr Test-Ergebnis steht noch nicht zur Verfügung.</string> + <string name="submission_test_result_pending_steps_waiting_body">"Your test result is not yet available."</string> <!-- XBUT: test result pending : refresh button --> - <string name="submission_test_result_pending_refresh_button">Aktualisieren</string> + <string name="submission_test_result_pending_refresh_button">"Update"</string> <!-- XBUT: test result pending : remove the test button --> - <string name="submission_test_result_pending_remove_test_button">Test entfernen</string> + <string name="submission_test_result_pending_remove_test_button">"Delete Test"</string> <!-- XHED: Page headline for negative test result next steps --> - <string name="submission_test_result_negative_steps_negative_heading">Ihr Test-Ergebnis</string> + <string name="submission_test_result_negative_steps_negative_heading">"Your Test Result"</string> <!-- YTXT: Body text for next steps section of test negative result --> - <string name="submission_test_result_negative_steps_negative_body">Der Labortest hat keinen Nachweis für das Coronavirus SARS-CoV-2 bei Ihnen ergeben. \n\nBitte entfernen Sie den Test wieder aus der Corona-Warn-App, damit Sie bei Bedarf einen neuen Test hinterlegen können.</string> + <string name="submission_test_result_negative_steps_negative_body">"The laboratory result indicates no verification that you have coronavirus SARS-CoV-2.\n\nPlease delete the test from the Corona-Warn-App, so that you can save a new test code here if necessary."</string> <!-- XBUT: negative test result : remove the test button --> - <string name="submission_test_result_negative_remove_test_button">Test entfernen</string> + <string name="submission_test_result_negative_remove_test_button">"Delete Test"</string> <!-- XHED: Page headline for positive test result screen --> - <string name="submission_test_result_positive_steps_positive_heading">Ihr Test-Ergebnis</string> + <string name="submission_test_result_positive_steps_positive_heading">"Your Test Result"</string> <!-- YTXT: Body text for next steps section of test positive result--> - <string name="submission_test_result_positive_steps_positive_body">Ihr Test-Ergebnis wurde erfolgreich als “Positiv†verifiziert.</string> + <string name="submission_test_result_positive_steps_positive_body">"Your test result was verified as positive."</string> <!-- XHED: Page headline for other warnings screen --> - <string name="submission_test_result_positive_steps_warning_others_heading">Andere warnen</string> + <string name="submission_test_result_positive_steps_warning_others_heading">"Warning Others"</string> <!-- YTXT: Body text for for other warnings screen--> - <string name="submission_test_result_positive_steps_warning_others_body">Ihre Zufallscodes der letzten 14 Tage teilen, um andere zu schützen und die Infektionskette zu unterbrechen.</string> + <string name="submission_test_result_positive_steps_warning_others_body">"Share your random IDs of the last 14 days in order to protect others and break the chain of infection."</string> <!-- XBUT: positive test result : continue button --> - <string name="submission_test_result_positive_continue_button">Weiter</string> + <string name="submission_test_result_positive_continue_button">"Next"</string> <!-- XHED: Page headline for invalid test result screen --> - <string name="submission_test_result_invalid_steps_invalid_heading">Ihr Test-Ergebnis</string> + <string name="submission_test_result_invalid_steps_invalid_heading">"Your Test Result"</string> <!-- YTXT: Body text for next steps section of invalid test result--> - <string name="submission_test_result_invalid_steps_invalid_body">Es gab ein Problem bei der Auswertung Ihres Tests. Bitte kontaktieren Sie das Gesundheitsamt um Information zum weiteren Vorgehen zu erhalten.\n\nBitte entfernen Sie den Test wieder aus der Corona-Warn-App, damit Sie bei Bedarf einen neuen Test hinterlegen können.</string> + <string name="submission_test_result_invalid_steps_invalid_body">"There was a problem evaluating your test. Please contact the public health authority to find out how to proceed. Please delete the test from your Corona-Warn-App so that you will be able to save a new test code there if necessary."</string> <!-- XBUT: invalid test result : remove the test button --> - <string name="submission_test_result_invalid_remove_test_button">Test entfernen</string> + <string name="submission_test_result_invalid_remove_test_button">"Delete Test"</string> <!-- XHED: Dialog title for tracing required dailog --> - <string name="submission_test_result_dialog_tracing_required_title">Risiko-Ermittlung erforderlich</string> + <string name="submission_test_result_dialog_tracing_required_title">"Exposure Logging required"</string> <!-- YTXT: Dialog text for tracing required dialog--> - <string name="submission_test_result_dialog_tracing_required_message">Bitte aktivieren Sie die Risiko-Ermittlung um andere zu warnen.</string> + <string name="submission_test_result_dialog_tracing_required_message">"Please activate exposure logging to warn other people."</string> <!-- XBUT: tracing required : OK button --> - <string name="submission_test_result_dialog_tracing_required_button">OK</string> + <string name="submission_test_result_dialog_tracing_required_button">"OK"</string> <!-- XHED: Dialog title for test removal --> - <string name="submission_test_result_dialog_remove_test_title">Test entfernen?</string> + <string name="submission_test_result_dialog_remove_test_title">"Delete the test?"</string> <!-- YTXT: Dialog text for test removal --> - <string name="submission_test_result_dialog_remove_test_message">Der Test wird endgültig aus der Corona-Warn-App entfernt und kann nicht wieder hinzugefügt werden. Dieser Vorgang kann nicht widerrufen werden.</string> + <string name="submission_test_result_dialog_remove_test_message">"The test will be permanently deleted from the Corona-Warn-App and cannot be added again. This procedure cannot be undone."</string> <!-- XBUT: Positive button for test removal --> - <string name="submission_test_result_dialog_remove_test_button_positive">Entfernen</string> + <string name="submission_test_result_dialog_remove_test_button_positive">"Remove"</string> <!-- XBUT: Negative button for test removal --> - <string name="submission_test_result_dialog_remove_test_button_negative">Abbrechen</string> + <string name="submission_test_result_dialog_remove_test_button_negative">"Cancel"</string> <!-- XHED: Title for test result card positive --> - <string name="submission_test_result_card_positive_title">SARS-CoV-2 Positiv</string> + <string name="submission_test_result_card_positive_title">"SARS-CoV-2 positive"</string> <!-- YTXT: Body text for test result card positive --> - <string name="submission_test_result_card_positive_body">Das Virus SARS-CoV-2 wurde bei Ihnen nachgewiesen.</string> + <string name="submission_test_result_card_positive_body">"You have been diagnosed with the SARS-CoV-2 virus."</string> <!-- Submission Tan --> <!-- XHED: Page title for TAN submission pge --> - <string name="submission_tan_title">TAN Eingabe</string> + <string name="submission_tan_title">"TAN entry"</string> <!-- YTXT: Body text for the tan submission page --> - <string name="submission_tan_body">Geben Sie bitte die 10 Stellen der TAN ein, die Ihnen mitgeteilt wurde.</string> + <string name="submission_tan_body">"Please enter the 10-digit TAN that you were given."</string> <!-- XBUT: Submit TAN button --> - <string name="submission_tan_button_text">Weiter</string> + <string name="submission_tan_button_text">"Next"</string> <!-- XACT: Submission Tan page title --> - <string name="submission_tan_accessibility_title">TAN Eingabe</string> + <string name="submission_tan_accessibility_title">"TAN entry"</string> <!-- YTXT: Error text for the tan submission page --> - <string name="submission_tan_error">Ungültige TAN, bitte überprüfen Sie Ihre Eingabe.</string> + <string name="submission_tan_error">"Invalid TAN, please check your entry."</string> <!-- YTXT: Error text for the tan submission page (wrong characters) --> - <string name="submission_tan_character_error">Ungültige Eingabe, bitte überprüfen Sie das Zeichen.</string> + <string name="submission_tan_character_error">"Invalid entry. Please check your entry."</string> <!-- Submission Intro --> <!-- XHED: Page title for menu at the start of the submission process --> - <string name="submission_intro_title">Wurden Sie getestet?</string> + <string name="submission_intro_title">"Have you been tested?"</string> <!-- XHED: Page headline for menu the at start of the submission process --> - <string name="submission_intro_headline">So funktionert das\nCorona-Warn-System</string> + <string name="submission_intro_headline">"This is how the Corona-Warn-App works"</string> <!-- YTXT: submission introduction text --> - <string name="submission_intro_text">Damit die Corona-Warn-App funktioniert, sind wir auf die Mithilfe von Corona-positiven Personen angewiesen.\n\nDa nur verschlüsselte Zufallscodes ausgetauscht werden, bleiben Sie unerkannt. Sie können jetzt wie folgt vorgehen:\n</string> + <string name="submission_intro_text">"For the app to work well, we are relying on the support of people who were diagnosed with COVID-19.\n\nSince only encrypted random IDs are exchanged, you remain anonymous. You can now proceed as follows:"</string> <!-- XBUT: Submission introduction next button--> - <string name="submission_intro_button_next">Weiter</string> + <string name="submission_intro_button_next">"Next"</string> <!-- XACT: Submission intro - illustration description, explanation image --> - <string name="submission_intro_illustration_description">Ein positiver Testbefund wird verschlüsselt ins System übermittelt, das nun andere Nutzerinnen und Nutzer warnt.</string> + <string name="submission_intro_illustration_description">"An encrypted positive test diagnosis is transmitted to the system, which will now warn other users."</string> <!-- YTXT: submission introduction bullet points --> <string-array name="submission_intro_bullet_points"> - <item>Wenn Sie positiv getestet wurden, können Sie andere warnen.</item> - <item>Wenn Ihnen für einen positiven Test eine TAN mitgeteilt wurde, können Sie diese für die Registrierung des Tests nutzen.</item> - <item>Wenn Sie keine TAN haben, können Sie diese telefonisch anfragen.</item> + <item>"If you have been diagnosed with COVID-19, you can notify others."</item> + <item>"If you were given a TAN for a positive diagnosis, you can use this to register the test."</item> + <item>"If you do not have a TAN, you can request one by telephone."</item> </string-array> <!-- XACT: Submission Intro page title --> - <string name="submission_intro_accessibility_title">Wurden Sie getestet? So funktioniert das Corona-Warn-System</string> + <string name="submission_intro_accessibility_title">"Have you been tested? This is how the Corona-Warn-App works"</string> <!-- Dispatcher --> <!-- XHED: Page headline for dispatcher menu --> - <string name="submission_dispatcher_headline">Auswahl</string> + <string name="submission_dispatcher_headline">"Selection"</string> <!-- XHED: Page subheadline for dispatcher menu --> - <string name="submission_dispatcher_subheadline">Welche Informationen liegen Ihnen vor?</string> + <string name="submission_dispatcher_subheadline">"What information do you have?"</string> <!-- YTXT: Dispatcher text for QR code option --> - <string name="submission_dispatcher_card_qr">Dokument mit QR-Code</string> + <string name="submission_dispatcher_card_qr">"Document with QR code"</string> <!-- YTXT: Body text for QR code dispatcher option --> - <string name="submission_dispatcher_qr_card_text">Registrieren Sie Ihren Test, indem Sie den QR-Code ihres Test-Dokument scannen</string> + <string name="submission_dispatcher_qr_card_text">"Register your test by scanning the QR code of your test document."</string> <!-- XHED: Dialog headline for dispatcher QR prviacy dialog --> - <string name="submission_dispatcher_qr_privacy_dialog_headline">Einwilligungserklärung</string> + <string name="submission_dispatcher_qr_privacy_dialog_headline">"Declaration of Consent"</string> <!-- YTXT: Dialog Body text for dispatcher QR privacy dialog --> - <string name="submission_dispatcher_qr_privacy_dialog_body">Durch Antippen von „Erlauben“ willigen Sie ein, dass die App den Status Ihres Corona-Virus-Tests abfragen und in der App anzeigen darf. Diese Funktion steht Ihnen zur Verfügung, wenn Sie einen QR-Code erhalten und eingewilligt haben, dass Ihr Testergebnis an das Serversystem der App übermittelt werden darf. Sobald das Testlabor Ihr Testergebnis auf dem Server hinterlegt hat, können Sie das Ergebnis in der App sehen. Falls Sie Mitteilungen aktiviert haben, werden Sie auch außerhalb der App über den Eingang des Testergebnis informiert. Das Testergebnis selbst wird aus Datenschutzgründen jedoch nur in der App angezeigt. Sie können diese Einwilligung jederzeit widerrufen, indem Sie die Testregistrierung in der App löschen. Durch den Widerruf der Einwilligung wird die Rechtmäßigkeit der bis zum Widerruf erfolgten Verarbeitung nicht berührt. Weitere Informationen finden Sie unter dem Menüpunkt „Datenschutzinformation“.</string> + <string name="submission_dispatcher_qr_privacy_dialog_body">"By tapping on “Acceptâ€, you consent to the App querying the status of your coronavirus test and displaying it in the App. This feature is available to you if you have received a QR code and have consented to your test result being transmitted to the App’s server system. As soon as the testing lab has stored your test result on the server, you will be able to see the result in the App. If you have enabled notifications, you will also receive a notification outside the App telling you that your test result has been received. However, for privacy reasons, the test result itself will only be displayed in the App. You can withdraw this consent at any time by deleting your test registration in the App. Withdrawing your consent will not affect the lawfulness of processing before its withdrawal. Further information can be found in the menu under “Data Privacy Informationâ€."</string> <!-- XBUT: submission(dispatcher QR Dialog) - positive button (right) --> - <string name="submission_dispatcher_qr_privacy_dialog_button_positive">Erlauben</string> + <string name="submission_dispatcher_qr_privacy_dialog_button_positive">"Accept"</string> <!-- XBUT: submission(dispatcher QR Dialog) - negative button (left) --> - <string name="submission_dispatcher_qr_privacy_dialog_button_negative">Nicht Erlauben</string> + <string name="submission_dispatcher_qr_privacy_dialog_button_negative">"Do Not Accept"</string> <!-- YTXT: Dispatcher text for TAN code option --> - <string name="submission_dispatcher_card_tan_code">TAN-Code</string> + <string name="submission_dispatcher_card_tan_code">"TAN"</string> <!-- YTXT: Body text for TAN code dispatcher option --> - <string name="submission_dispatcher_tan_code_card_text">Registrieren Sie Ihren Test per manueller TAN Eingabe</string> + <string name="submission_dispatcher_tan_code_card_text">"Register your test by entering your TAN manually."</string> <!-- YTXT: Dispatcher text for TELE-TAN option --> - <string name="submission_dispatcher_card_tan_tele">Noch keine TAN?</string> + <string name="submission_dispatcher_card_tan_tele">"No TAN yet?"</string> <!-- YTXT: Body text for TELE_TAN dispatcher option --> - <string name="submission_dispatcher_tan_tele_card_text">Bitte rufen Sie uns an, falls Sie Positiv getestet wurden</string> + <string name="submission_dispatcher_tan_tele_card_text">"Please call us if you have been diagnosed with COVID-19."</string> <!-- XACT: Dispatcher Tan page title --> - <string name="submission_dispatcher_accessibility_title">Welche Informationen liegen ihnen vor?</string> + <string name="submission_dispatcher_accessibility_title">"What information is here for you?"</string> <!-- Submission Positive Other Warning --> <!-- XHED: Page title for the positive result additional warning page--> - <string name="submission_positive_other_warning_title">Andere warnen</string> + <string name="submission_positive_other_warning_title">"Warning Others"</string> <!-- XHED: Page headline for the positive result additional warning page--> - <string name="submission_positive_other_warning_headline">Helfen Sie mit!</string> + <string name="submission_positive_other_warning_headline">"Please help all of us!"</string> <!-- YTXT: Body text for the positive result additional warning page--> - <string name="submission_positive_other_warning_body">Als Nächstes können Sie dafür sorgen, dass das Corona-Warn-System Ihre lokal gespeicherten Zufallscodes der letzten 14 Tage an andere verteilt. So können Sie Ihre Mitmenschen warnen und helfen, die Infektionskette zu unterbrechen. \n\nDa nur unpersönliche Zufallscodes übertragen werden, bleibt Ihre Identität unbekannt.</string> + <string name="submission_positive_other_warning_body">"Next, you can make sure that the Corona-Warn-App shares your random IDs of the last 14 days with others. By doing this, you can warn other people and help to break the infection chain.\n\nSince only impersonal random IDs are transmitted, your identity remains anonymous."</string> <!-- XHED: Title for the privacy card--> - <string name="submission_positive_other_warning_privacy_title">Datenschutz</string> + <string name="submission_positive_other_warning_privacy_title">"Data Privacy"</string> <!-- YTXT: Body text for the privacy card--> - <string name="submission_positive_other_warning_privacy_body">Durch Antippen von „Weiter“ willigen Sie ein, dass die App Ihr positives Testergebnis zusammen mit Ihren Zufalls-IDs der letzten 14 Tage an das Serversystem der App übermittelt, damit andere App-Nutzer mit aktivierter Risiko-Ermittlung automatisch informiert werden können, dass sie möglicherweise einem Infektionsrisiko ausgesetzt waren. Die übermittelten Zufalls-IDs enthalten keine Angaben, die Rückschlüsse auf Ihre Identität oder Ihre Person zulassen.\n\nDie Ãœbermittlung Ihres Testergebnisses per App ist freiwillig. Wenn Sie Ihr Testergebnis nicht übermitteln, entstehen Ihnen keine Nachteile. Da weder nachvollzogen noch kontrolliert werden kann, ob und wie Sie die App verwenden, erfährt außer Ihnen niemand, ob Sie eine Infektion übermittelt haben.\n\nSie können Ihre Einwilligung jederzeit widerrufen, indem Sie die App löschen. Durch den Widerruf der Einwilligung wird die Rechtmäßigkeit der aufgrund der Einwilligung bis zum Widerruf erfolgten Verarbeitung nicht berührt. Weitere Informationen finden Sie unter dem Menüpunkt „Datenschutzinformation“.</string> + <string name="submission_positive_other_warning_privacy_body">"By tapping on “Acceptâ€, you consent to the App sending your positive test result to the App’s server system along with your random IDs from the last 14 days, so that other App users who have enabled the exposure logging feature can be automatically notified that they may have been exposed to a risk of infection. The random IDs transmitted for this purpose do not contain any information that would allow conclusions to be drawn about your identity or your person. \n\nTransmitting your test result via the App is voluntary. You will not be penalized if you do not transmit your test result. Since it is not possible to trace or check whether and how you use the App, nobody but you will know whether you have transmitted the information that you are infected.\n\nYou can withdraw your consent at any time by deleting the App. This withdrawal of your consent will not affect the lawfulness of the processing carried out based on the consent prior to the withdrawal. Further information can be found in the menu under “Data Privacy Informationâ€."</string> <!-- XBUT: other warning continue button --> - <string name="submission_positive_other_warning_button">Weiter</string> + <string name="submission_positive_other_warning_button">"Next"</string> <!-- XACT: other warning - illustration description, explanation image --> - <string name="submission_positive_other_illustration_description">Ein Smartphone übermittelt einen positiven Testbefund verschlüsselt ins System.</string> + <string name="submission_positive_other_illustration_description">"A device is transmitting an encrypted positive test diagnosis to the system."</string> <!-- Submission Done --> <!-- XHED: Page title for completed submission page --> - <string name="submission_done_title">Vielen Dank!</string> + <string name="submission_done_title">"Thank you"</string> <!-- YTXT: Body text for completed submission page --> - <string name="submission_done_body">Sie haben einen wichtigen Beitrag geleistet! Dank Ihrer Mithilfe können Andere gewarnt werden und entsprechend reagieren.</string> + <string name="submission_done_body">"You have made a valuable contribution. Thanks to your support, other people can now be warned and can react appropriately."</string> <!-- XHED: Page subtitle for completed submission page --> - <string name="submission_done_subtitle">Bitte beachten Sie:</string> + <string name="submission_done_subtitle">"Please note:"</string> <!-- YTXT: text after submission: contagious --> - <string name="submission_done_contagious">Sie sind ansteckend.</string> + <string name="submission_done_contagious">"You are infectious."</string> <!-- YTXT: text after submission: isolate --> - <string name="submission_done_isolate">Isolieren Sie sich von anderen Personen.</string> + <string name="submission_done_isolate">"Please isolate yourself from other people."</string> <!-- XHED: Title for further info --> - <string name="submission_done_further_info_title">Weitere Infos:</string> + <string name="submission_done_further_info_title">"Other information:"</string> <!-- YTXT: submission done further info bullet points --> <string-array name="submission_done_further_info_bullet_points"> - <item>Ihre Quarantänezeit beträgt im Regelfall 14 Tage. Beobachten und erfassen Sie genau, wie sich ihre Krankheitszeichen entwickeln.</item> - <item>Sie werden von Ihrem Gesundheitsamt gebeten, eine Liste Ihrer Kontaktpersonen zu erstellen. Dabei sollen alle Personen erfasst werden, mit denen Sie in den zwei Tagen vor Erkrankungsbeginn engen Kontakt (unter 2 Meter, direktes Gespräch) über insgesamt 15 Minuten hatten.</item> - <item>Bitte denken Sie hier auch besonders an Personen, die nicht automatisch durch die App informiert werden, da sie kein Smartphone oder die App haben.</item> - <item>Auch wenn Sie keine Krankheitszeichen mehr haben und sich wieder gesund fühlen, könnten Sie noch ansteckend sein.</item> + <item>"Your quarantine period is usually 14 days. Please observe your symptoms and monitor how they develop."</item> + <item>"You will be asked by your public health authority to create a list of people you have had contact with. This should include all people with whom you have had close contact with (less than 2 meters, face-to-face conversation) for over 15 minutes in the two days before you developed symptoms."</item> + <item>"Please think especially about the people who will not be notified directly by the app since they don\'t have a device, or haven\'t installed the app."</item> + <item>"Even when you no longer have any symptoms and you feel well again, you could still be infectious."</item> </string-array> <!-- XBUT: submission finished button --> - <string name="submission_done_button_done">Fertig</string> + <string name="submission_done_button_done">"Done"</string> <!-- XACT: submission finished - illustration description, explanation image --> - <string name="submission_done_illustration_description">Eine vielfältige Gruppe begrüßt durch Jubel, dass jemand sein Testergebnis mit anderen geteilt hat.</string> + <string name="submission_done_illustration_description">"Everyone in the group is cheering because someone has shared the test result."</string> <!-- Submission Contact --> <!-- XHED: Page title for contact page in submission flow --> - <string name="submission_contact_title">TAN anfragen</string> + <string name="submission_contact_title">"Request TAN"</string> <!-- XHED: Page headline for contact page in submission flow --> - <string name="submission_contact_headline">Info zum Ablauf:</string> + <string name="submission_contact_headline">"How this works:"</string> <!-- YTXT: Body text for contact page in submission flow--> - <string name="submission_contact_body">Wir teilen Ihnen Ihren TAN-Code gerne per Telefon mit.</string> + <string name="submission_contact_body">"We can tell you your TAN by telephone."</string> <!-- XBUT: submission contact call button --> - <string name="submission_contact_button_call">Anrufen</string> + <string name="submission_contact_button_call">"Call"</string> <!-- XBUT: submission contact enter tan button --> - <string name="submission_contact_button_enter">TAN-Code eingeben</string> + <string name="submission_contact_button_enter">"Enter TAN"</string> <!-- YTXT: Body text for step 1 of contact page --> - <string name="submission_contact_step_1_body"><![CDATA[Hotline anrufen & TAN erfragen:]]></string> + <string name="submission_contact_step_1_body">"Call the hotline and request a TAN:\n"</string> <!-- XLNK: Button / hyperlink to phone call for TAN contact page --> - <string name="submission_contact_number_display">+49 (0) 800 7540002</string> + <string name="submission_contact_number_display">"+49 800 7540002"</string> <!-- XLNK: Technical number which is called when the user clicks on the display number --> - <string name="submission_contact_number_dial">+49 800 7540002</string> + <string name="submission_contact_number_dial">"+49 800 7540002"</string> <!-- YTXT: Body text for step 2 of contact page--> - <string name="submission_contact_step_2_body">Test per TAN-Eingabe in der App registrieren</string> + <string name="submission_contact_step_2_body">"Register the test by entering the TAN in the app."</string> <!-- YTXT: Body text for operating hours in contact page--> - <string name="submission_contact_operating_hours_body">Unsere Öffnungszeiten:\nMo - Fr: 08:00 - 22:00 Uhr\nSa - So: 10:00 - 22:00 Uhr\nEs gelten die Preise Ihres\nTelefonanbieters.</string> + <string name="submission_contact_operating_hours_body">"Languages: \nGerman, English, Turkish\n\nBusiness hours:\nMonday to Friday: 8am - 10pm; \nSaturday to Sunday: 10am - 10pm\n\nThe call is free of charge."</string> <!-- XACT: Submission contact page title --> - <string name="submission_contact_accessibility_title">TAN Anfrage per Telefonanruf</string> + <string name="submission_contact_accessibility_title">"Call the hotline and request a TAN"</string> <!-- XACT: Content Description for submission contact step 1, number has to sync with the display number --> - <string name="submission_contact_step_1_content">Im ersten Schritt Hotline anrufen und TAN erfragen, unter der Rufnummer +49 (0) 800 7540002. Die Öffnungszeiten sind Montag bis Freitag von 8 bis 22 Uhr sowie Samstag und Sonntag von 10 bis 22 Uhr. Es gelten die Preise ihres Telefonanbieters.</string> + <string name="submission_contact_step_1_content">"In the first step, you call the hotline and request your TAN. You can reach the hotline on +49 800 7540002. The business hours are Monday to Friday from 8 am to 10 pm and Saturday and Sunday from 10 am to 10 pm. The call is free of charge."</string> <!-- XACT: Content Description for submission contact step 2 --> - <string name="submission_contact_step_2_content">Im Zweiten Schritt registrieren Sie den Test per TAN-Eingabe in der App</string> + <string name="submission_contact_step_2_content">"In the second step, you register your test with your TAN in the app."</string> <!-- Submission Status Card --> <!-- XHED: Page title for the various submission status: fetching --> - <string name="submission_status_card_title_fetching">Datenabruf…</string> + <string name="submission_status_card_title_fetching">"Data being retrieved...."</string> <!-- XHED: Page title for the various submission status: unregistered --> - <string name="submission_status_card_title_unregistered">Wurden Sie getestet?</string> + <string name="submission_status_card_title_unregistered">"Have you been tested?"</string> <!-- XHED: Page title for the various submission status: pending --> - <string name="submission_status_card_title_pending">Ergebnis liegt noch nicht vor</string> + <string name="submission_status_card_title_pending">"Your result is not yet available"</string> <!-- XHED: Page title for the various submission status: available --> - <string name="submission_status_card_title_available">Ihr Ergebnis liegt vor</string> + <string name="submission_status_card_title_available">"Your result is available"</string> <!-- XHED: Page title for the various submission status: positive --> - <string name="submission_status_card_title_positive">Befund Positiv</string> + <string name="submission_status_card_title_positive">"Positive Diagnosis"</string> <!-- XHED: Subtitle for the submission status card: invalid --> - <string name="submission_status_card_subtitle_invalid">Fehlerhafter Test</string> + <string name="submission_status_card_subtitle_invalid">"Invalid test"</string> <!-- XHED: Subtitle for the submission status card: negative --> - <string name="submission_status_card_subtitle_negative">Befund Negativ</string> + <string name="submission_status_card_subtitle_negative">"Negative Diagnosis"</string> <!-- YTXT: Body text for submission status: fetching --> - <string name="submission_status_card_body_fetching">Das Ergebnis wird aktualisiert</string> + <string name="submission_status_card_body_fetching">"You result is being updated"</string> <!-- YTXT: Body text for submission status: unregistered --> - <string name="submission_status_card_body_unregistered">Helfen Sie, die Ausbreitung des Virus zu verlangsamen.</string> + <string name="submission_status_card_body_unregistered">"Help to break the infection chain by notifying others."</string> <!-- YTXT: Body text for submission status: pending --> - <string name="submission_status_card_body_pending">Die Auswertung Ihres Tests ist noch nicht abgeschlossen.</string> + <string name="submission_status_card_body_pending">"The evaluation of your test is not yet done."</string> <!-- YTXT: Body text for submission status: invalid --> - <string name="submission_status_card_body_invalid">Ihr Test konnte nicht ausgewertet werden.</string> + <string name="submission_status_card_body_invalid">"Your test could not be evaluated."</string> <!-- YTXT: Body text for submission status: positive --> - <string name="submission_status_card_body_positive">Sie wurden positiv auf SARS-CoV-2 getestet.</string> + <string name="submission_status_card_body_positive">"You have been diagnosed positive for SARS-CoV-2."</string> <!-- YTXT: Body text for submission status: negative --> - <string name="submission_status_card_body_negative">Das Virus SARS-CoV-2 konnte bei Ihnen nicht nachgewiesen werden.</string> + <string name="submission_status_card_body_negative">"You have been diagnosed negative for SARS-CoV-2."</string> <!-- XBUT: submission status card unregistered button --> - <string name="submission_status_card_button_unregistered">Informieren & mitmachen</string> + <string name="submission_status_card_button_unregistered">"Notify and Help"</string> <!-- XBUT: submission status card show results button --> - <string name="submission_status_card_button_show_results">Test anzeigen</string> + <string name="submission_status_card_button_show_results">"Display Test"</string> <!-- XHED: submission status card positive result subtitle --> - <string name="submission_status_card_positive_result_subtitle">Bitte beachten Sie:</string> + <string name="submission_status_card_positive_result_subtitle">"Please note:"</string> <!-- YTXT: text for contagious card --> - <string name="submission_status_card_positive_result_contagious">Sie sind ansteckend. Isolieren Sie sich von anderen Personen.</string> + <string name="submission_status_card_positive_result_contagious">"You are infectious. Isolate yourself from other people."</string> <!-- YTXT: text for contact card --> - <string name="submission_status_card_positive_result_contact">Das Gesundheitsamt wird sich in den nächsten Tagen telefonisch oder schriftlich bei Ihnen melden.</string> + <string name="submission_status_card_positive_result_contact">"The public health authority will contact you within the next few days by telephone or by letter."</string> <!-- YTXT: text for share result card--> - <string name="submission_status_card_positive_result_share">Teilen Sie Ihre Zufallskennungen, damit andere gewarnt werden können.</string> + <string name="submission_status_card_positive_result_share">"Share your random IDs so that others can be warned."</string> <!-- Test Result Card --> - <string name="test_result_card_headline">Ihr Befund:</string> + <string name="test_result_card_headline">"Your diagnosis:"</string> <!-- YTXT: virus name text --> - <string name="test_result_card_virus_name_text">SARS-CoV-2</string> + <string name="test_result_card_virus_name_text">"SARS-CoV-2"</string> <!-- YTXT: registered at text --> - <string name="test_result_card_registered_at_text">Registriert am %s</string> + <string name="test_result_card_registered_at_text">"Registered on %s"</string> <!-- YTXT: negative status text --> - <string name="test_result_card_status_negative">Negativ</string> + <string name="test_result_card_status_negative">"Negative"</string> <!-- YTXT: positive status text --> - <string name="test_result_card_status_positive">Positiv</string> + <string name="test_result_card_status_positive">"Positive"</string> <!-- YTXT: invalid status text --> - <string name="test_result_card_status_invalid">Auswertung nicht möglich</string> + <string name="test_result_card_status_invalid">"Evaluation is not possible"</string> <!-- YTXT: pending status text --> - <string name="test_result_card_status_pending">Ergebnis liegt noch nicht vor</string> + <string name="test_result_card_status_pending">"Your result is not available"</string> <!-- XHED: Title for further info of test result negative --> - <string name="test_result_card_negative_further_info_title">Weitere Infos:</string> + <string name="test_result_card_negative_further_info_title">"Other information:"</string> <!-- YTXT: Content for further info of test result negative --> <string-array name="test_result_card_negative_further_info_bullet_points"> - <item>Sie haben trotzdem gesundheitliche Beschwerden? Wenn Sie sich sehr krankfühlen und/oder Ihre Beschwerden sich verschlechtert haben, wenden Sie sich bitte an Ihre/-n Hausärztin/Hausarzt.</item> - <item>Bleiben Sie bis zu Ihrer Genesung trotzdem zu Hause. Falls Sie sich durch eine andere Infektion geschwächt mit dem Coronavirus (SARS-CoV-2) infizieren, kann dies zu schwereren Krankheitsverläufen führen.</item> - <item>Gehen Sie nicht krank zur Arbeit, um andere Personen nicht zu gefährden. Falls sich Ihre Symptome verschlechtern, kann die Notwendigkeit eines weiteren SARS-CoV-2-Tests bestehen.</item> + <item>"Still feeling unwell? If you feel very poorly and/or your symptoms have worsened, please contact your general practitioner."</item> + <item>"Remain at home until you feel well again. If you were to get infected with coronavirus (SARS-CoV-2) whilst weakened from another infection, this could lead to a serious illness."</item> + <item>"Do not go to work if you feel unwell to ensure you do not put other people at risk. If your symptoms worsen, you might need a further SARS-CoV-2 test."</item> </string-array> <!-- #################################### Button Tooltips for Accessibility ###################################### --> <!-- XACT: back button--> - <string name="button_back">Zurück zur vorherigen Seite</string> + <string name="button_back">"Back to previous page"</string> <!-- XACT: proceed button--> - <string name="button_proceed">Fortfahren Button</string> + <string name="button_proceed">"Continue Button"</string> <!-- XACT: share button--> - <string name="button_share">Teilen</string> + <string name="button_share">"Share"</string> <!-- XACT: menu button--> - <string name="button_menu">Menü</string> + <string name="button_menu">"Menu"</string> + <!-- XACT: Accessibility needs a suffix to strings, to reduce the amount of manual translations this string is appended to accessibility button strings, e.g. "Zurück Taste", "Taste" is the default used by android in german --> + <string name="suffix_button">"Button"</string> + <!-- XACT: Accessibility needs a suffix to strings, to reduce the amount of manual translations this string is appended to accessibility content description strings for images, e.g. "Eine Gruppe von... Bild" --> + <string name="suffix_image">"Image"</string> <!-- #################################### Business Error Messages ###################################### --> <!-- XTXT: error dialog - detailed text if device is offline --> - <string name="errors_no_network">Sie sind nicht mit dem Internet verbunden.</string> + <string name="errors_no_network">"You are not connected to the Internet."</string> <!-- XTXT: error dialog - detailed text if device has not enough device space --> - <string name="errors_not_enough_device_storage">Sie haben nicht genug Speicherplatz.</string> + <string name="errors_not_enough_device_storage">"You do not have enough memory available."</string> <!-- XTXT: error dialog - detailed text if there is error with Google API --> - <string name="errors_communication_with_api">Fehler bei Kommunikation mit Google API.</string> + <string name="errors_communication_with_api">"Error when communicating with Google API"</string> <!-- XTXT: error dialog - detailed text if there is an error during external navigation / external action --> - <string name="errors_external_action">Diese Aktion ist aktuell leider nicht verfügbar. Bitte kontaktieren Sie die Hotline.</string> + <string name="errors_external_action">"You cannot perform this action. Please contact the hotline."</string> <!-- #################################### Generic Error Messages ###################################### --> <!-- XHED: error dialog - headline --> - <string name="errors_generic_headline">Etwas ist schief gelaufen</string> + <string name="errors_generic_headline">"Something went wrong."</string> <!-- XTXT: error dialog - short text for error reason --> - <string name="errors_generic_details_headline">Ursache</string> + <string name="errors_generic_details_headline">"Cause"</string> <!-- XBUT: error dialog - button close --> - <string name="errors_generic_button_positive">Okay</string> + <string name="errors_generic_button_positive">"OK"</string> <!-- XBUT: error dialog - button show details --> - <string name="errors_generic_button_negative">Details</string> + <string name="errors_generic_button_negative">"Details"</string> <!-- XTXT: error dialog - text when no error description is available --> - <string name="errors_generic_text_unknown_error_cause">Ein unbekanntes Problem ist aufgetreten</string> + <string name="errors_generic_text_unknown_error_cause">"An unknown error occurred."</string> <!-- #################################### Just for Development ###################################### --> <!-- NOTR --> - <string name="lorem_ipsum">Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</string> + <string name="lorem_ipsum">"Lorem Ipsum..."</string> <!-- TODO test fragment only - remove after test fragment is deleted--> <!-- NOTR --> - <string name="menu_test_api">Test API</string> + <string name="menu_test_api">"Test API"</string> <!-- NOTR --> - <string name="menu_test_risk_level">Test Risk Level</string> + <string name="menu_test_risk_level">"Test Risk Level"</string> <!-- NOTR --> - <string name="menu_test_notification">Test Notification</string> + <string name="menu_test_notification">"Test Notification"</string> <!-- NOTR --> - <string name="test_api_button_api_launch">Android API Test(Manual Test)</string> + <string name="test_api_button_api_launch">"Android API Test(Manual Test)"</string> <!-- NOTR --> - <string name="test_api_button_start">Start (Broadcast/Receive Bluetooth)</string> + <string name="test_api_button_start">"Start (Broadcast/Receive Bluetooth)"</string> <!-- NOTR --> - <string name="test_api_button_get_exposure_keys">Get Exposure keys (my keys history from api)</string> + <string name="test_api_button_get_exposure_keys">"Get Exposure keys (my keys history from api)"</string> <!-- NOTR --> - <string name="test_api_button_share_my_keys">Share my keys via Email</string> + <string name="test_api_button_share_my_keys">"Share my keys via Email"</string> <!-- NOTR --> - <string name="test_api_button_enter_other_keys">Submit Exposure Key</string> + <string name="test_api_button_enter_other_keys">"Submit Exposure Key"</string> <!-- NOTR --> - <string name="test_api_button_show_qr_code">Show QR Code</string> + <string name="test_api_button_show_qr_code">"Show QR Code"</string> <!-- NOTR --> - <string name="test_api_button_submit_keys">Submit keys to Server</string> + <string name="test_api_button_submit_keys">"Submit keys to Server"</string> <!-- NOTR --> - <string name="test_api_button_scan_qr_code">Scan Exposure Key</string> + <string name="test_api_button_scan_qr_code">"Scan Exposure Key"</string> <!-- NOTR --> - <string name="test_api_switch_last_three_hours_from_server">Last 3 Hours Mode</string> + <string name="test_api_switch_last_three_hours_from_server">"Last 3 Hours Mode"</string> <!-- NOTR --> - <string name="test_api_button_check_exposure">Check Exposure Summary</string> + <string name="test_api_button_check_exposure">"Check Exposure Summary"</string> <!-- NOTR --> - <string name="test_api_exposure_summary_headline">Exposure summary</string> + <string name="test_api_exposure_summary_headline">"Exposure summary"</string> <!-- NOTR --> - <string name="test_api_body_daysSinceLastExposure">Days since last exposure: %1$s</string> + <string name="test_api_body_daysSinceLastExposure">"Days since last exposure: %1$s"</string> <!-- NOTR --> - <string name="test_api_body_attenuation">Attenuation Durations in Minutes: %1$s</string> + <string name="test_api_body_attenuation">"Attenuation Durations in Minutes: %1$s"</string> <!-- NOTR --> - <string name="test_api_body_summation_risk">Summation Risk Score: %1$s</string> + <string name="test_api_body_summation_risk">"Summation Risk Score: %1$s"</string> <!-- NOTR --> - <string name="test_api_body_matchedKeyCount">Matched key count: %1$s</string> + <string name="test_api_body_matchedKeyCount">"Matched key count: %1$s"</string> <!-- NOTR --> - <string name="test_api_body_maximumRiskScore">Maximum risk score %1$s</string> + <string name="test_api_body_maximumRiskScore">"Maximum risk score %1$s"</string> <!-- NOTR --> - <string name="test_api_body_my_keys">My keys (count: %1$d) </string> + <string name="test_api_body_my_keys">"My keys (count: %1$d)"</string> <!-- NOTR --> - <string name="test_api_body_other_keys">Other key </string> + <string name="test_api_body_other_keys">"Other key"</string> <!-- NOTR --> - <string name="test_api_calculate_risk_level">Calculate Risk Level</string> + <string name="test_api_calculate_risk_level">"Calculate Risk Level"</string> -</resources> +</resources> \ No newline at end of file diff --git a/Corona-Warn-App/src/main/res/values/styles.xml b/Corona-Warn-App/src/main/res/values/styles.xml index 4003d8094e521f6e3591c8cce3d99ea7098a7ee8..c479ad198c7a8c138f7673166268a3c89b4eb1e9 100644 --- a/Corona-Warn-App/src/main/res/values/styles.xml +++ b/Corona-Warn-App/src/main/res/values/styles.xml @@ -2,7 +2,7 @@ <style name="AppTheme" parent="Theme.AppCompat.DayNight"> <item name="colorPrimary">@color/colorBrandSecondary</item> - <item name="colorPrimaryDark">@color/colorAccentTintButtonPressed</item> + <item name="colorPrimaryDark">@color/colorStableDark</item> <item name="android:windowBackground">@color/colorBackground</item> <item name="alertDialogTheme">@style/dialog</item> </style> @@ -108,6 +108,7 @@ </style> <style name="rowOverview" parent="@style/row"> + <item name="android:paddingStart">@dimen/match_constraint</item> <item name="android:paddingTop">@dimen/spacing_tiny</item> <item name="android:paddingBottom">@dimen/spacing_tiny</item> </style> @@ -235,8 +236,8 @@ ###################################### --> <style name="tanInputDigit" parent="headline6"> - <item name="android:layout_width">@dimen/submission_tan_input_digit_width</item> - <item name="android:layout_height">@dimen/submission_tan_input_digit_height</item> + <item name="android:layout_width">wrap_content</item> + <item name="android:layout_height">wrap_content</item> <item name="android:background">@drawable/tan_input_digit</item> <item name="android:gravity">center</item> <item name="android:layout_marginStart">@dimen/submission_tan_input_digit_spacing</item> @@ -266,7 +267,7 @@ ###################################### --> <style name="registrationQRCodeScanBody"> <item name="android:textAlignment">center</item> - <item name="android:textColor">@color/colorTextLight</item> + <item name="android:textColor">@color/colorStableLight</item> <item name="android:textSize">14sp</item> </style> </resources> diff --git a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/risk/RiskLevelCalculationTest.kt b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/risk/RiskLevelCalculationTest.kt index 3a17562f085cf105e1e5822a365318e610f53712..237f7274f6686ff9285542944a48851f6eb35cb0 100644 --- a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/risk/RiskLevelCalculationTest.kt +++ b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/risk/RiskLevelCalculationTest.kt @@ -62,6 +62,17 @@ class RiskLevelCalculationTest { assertEquals(9830.4, riskScore) } + @Test + fun calculateRiskScoreCapped() { + val riskScore = + RiskLevelCalculation.calculateRiskScore( + buildAttenuationDuration(0.5, 0.5, 1.0), + buildSummary(4096, 45, 45, 45) + ) + + assertEquals(9830.4, riskScore) + } + private fun buildAttenuationDuration( high: Double, mid: Double, diff --git a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/transaction/RiskLevelTransactionTest.kt b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/transaction/RiskLevelTransactionTest.kt index 9ecb02b8e9b8331760a84d158617bde2a205bddf..b22992e9f43e4d35ba26f2712b7347f851dbb305 100644 --- a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/transaction/RiskLevelTransactionTest.kt +++ b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/transaction/RiskLevelTransactionTest.kt @@ -3,7 +3,6 @@ package de.rki.coronawarnapp.transaction import android.content.Context import com.google.android.gms.nearby.exposurenotification.ExposureSummary import de.rki.coronawarnapp.CoronaWarnApplication -import de.rki.coronawarnapp.exception.TransactionException import de.rki.coronawarnapp.nearby.InternalExposureNotificationClient import de.rki.coronawarnapp.risk.RiskLevel import de.rki.coronawarnapp.risk.RiskLevel.INCREASED_RISK @@ -363,7 +362,7 @@ class RiskLevelTransactionTest { } /** Test case if app is not connected */ - @Test(expected = TransactionException::class) + @Test fun checkAppConnectivity() { val testRiskLevel = INCREASED_RISK diff --git a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/ui/submission/SubmissionTanViewModelTest.kt b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/ui/submission/SubmissionTanViewModelTest.kt index 96973d9dc6cb3098ca91507c7e7bc8d01b785b03..805e975068920ae3916e0fc6f42bfa0cdfb12eb8 100644 --- a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/ui/submission/SubmissionTanViewModelTest.kt +++ b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/ui/submission/SubmissionTanViewModelTest.kt @@ -14,15 +14,6 @@ import org.junit.Test class SubmissionTanViewModelTest { private var viewModel: SubmissionTanViewModel = SubmissionTanViewModel() - @Test - fun allCharactersValid() { - viewModel.tan.postValue("ABCD") - viewModel.tanCharactersValid.value?.let { assertTrue(it) } - - viewModel.tan.postValue("ABCD0") - viewModel.tanCharactersValid.value?.let { assertFalse(it) } - } - @Test fun tanFormatValid() { viewModel.tan.postValue("ZWFPC7NG47") @@ -38,15 +29,6 @@ class SubmissionTanViewModelTest { viewModel.isValidTanFormat.value?.let { assertFalse(it) } } - @Test - fun checksumValid() { - viewModel.tan.postValue("ZWFPC7NG47") - viewModel.tanChecksumValid.value?.let { assertTrue(it) } - - viewModel.tan.postValue("ZWFPC7NG48") - viewModel.tanChecksumValid.value?.let { assertFalse(it) } - } - @Test fun testTanStorage() { val sr = mockk<SubmissionRepository> { diff --git a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/util/ExternalActionHelperTest.kt b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/util/ExternalActionHelperTest.kt index bfe5717ab17ecfb063d615bb6914ef73235740b1..0ca6efe8ca0da64c57dfd852a2253cd8427774ee 100644 --- a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/util/ExternalActionHelperTest.kt +++ b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/util/ExternalActionHelperTest.kt @@ -1,26 +1,86 @@ package de.rki.coronawarnapp.util +import android.content.Context +import android.content.pm.ApplicationInfo import androidx.fragment.app.Fragment +import de.rki.coronawarnapp.CoronaWarnApplication +import io.mockk.MockKAnnotations import io.mockk.Runs import io.mockk.every +import io.mockk.impl.annotations.MockK import io.mockk.just import io.mockk.mockk +import io.mockk.mockkObject +import io.mockk.unmockkAll import io.mockk.verify +import org.junit.After +import org.junit.Before import org.junit.Test -/** - * ExternalActionHelper test. - */ class ExternalActionHelperTest { - /** - * Test activity called. - */ + @MockK + private lateinit var context: Context + + @MockK + private lateinit var applicationInfo: ApplicationInfo + + @Before + fun setUp() { + MockKAnnotations.init(this) + mockkObject(CoronaWarnApplication) + } + + @Test + fun toConnectionsTest() { + every { context.startActivity(any()) } just Runs + ExternalActionHelper.toConnections(context = context) + verify(exactly = 1) { context.startActivity(any()) } + } + + @Test + fun toNotificationsTest() { + every { context.startActivity(any()) } just Runs + every { context.packageName } returns "package_name" + every { context.applicationInfo } returns applicationInfo + + ExternalActionHelper.toNotifications(context = context) + verify(exactly = 1) { context.startActivity(any()) } + } + + @Test + fun toMainSettingsTest() { + every { context.startActivity(any()) } just Runs + ExternalActionHelper.toConnections(context = context) + verify(exactly = 1) { context.startActivity(any()) } + } + @Test - fun testCall() { + fun openUrlTest() { val fragment = mockk<Fragment>() every { fragment.startActivity(any()) } just Runs - ExternalActionHelper.call(fragment, "+77777777777") + ExternalActionHelper.openUrl(fragment = fragment, url = "url_path") verify(exactly = 1) { fragment.startActivity(any()) } } + + @Test + fun callTest() { + val fragment = mockk<Fragment>() + every { fragment.startActivity(any()) } just Runs + ExternalActionHelper.call(fragment = fragment, uri = "call_path") + verify(exactly = 1) { fragment.startActivity(any()) } + } + + @Test + fun shareTextTest() { + val fragment = mockk<Fragment>() + every { fragment.startActivity(any()) } just Runs + ExternalActionHelper.shareText(fragment = fragment, text = "text", title = "title") + verify(exactly = 1) { fragment.startActivity(any()) } + } + + @After + fun cleanUp() { + unmockkAll() + } } diff --git a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/util/TimeAndDateExtensionsTest.kt b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/util/TimeAndDateExtensionsTest.kt new file mode 100644 index 0000000000000000000000000000000000000000..6366bbeb12e9c6488bb42b47490d7ad18b57c1b3 --- /dev/null +++ b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/util/TimeAndDateExtensionsTest.kt @@ -0,0 +1,50 @@ +package de.rki.coronawarnapp.util + +import de.rki.coronawarnapp.CoronaWarnApplication +import de.rki.coronawarnapp.util.TimeAndDateExtensions.calculateDays +import de.rki.coronawarnapp.util.TimeAndDateExtensions.getCurrentHourUTC +import io.mockk.MockKAnnotations +import io.mockk.mockkObject +import io.mockk.unmockkAll +import org.hamcrest.CoreMatchers +import org.hamcrest.MatcherAssert +import org.joda.time.DateTime +import org.joda.time.DateTimeZone +import org.joda.time.Instant +import org.junit.After +import org.junit.Before +import org.junit.Test +import java.util.concurrent.TimeUnit + +/** + * TimeAndDateExtensions test. + */ + +class TimeAndDateExtensionsTest { + + @Before + fun setUp() { + MockKAnnotations.init(this) + mockkObject(CoronaWarnApplication) + } + + @Test + fun getCurrentHourUTCTest() { + val result = getCurrentHourUTC() + MatcherAssert.assertThat(result, CoreMatchers.`is`(DateTime(Instant.now(), DateTimeZone.UTC).hourOfDay().get())) + } + + @Test + fun calculateDaysTest() { + val lFirstDate = DateTime(2019, 1, 1, 1, 1).millis + val lSecondDate = DateTime(2020, 1, 1, 1, 1).millis + + val result = calculateDays(firstDate = lFirstDate, secondDate = lSecondDate) + MatcherAssert.assertThat(result, CoreMatchers.`is`(TimeUnit.MILLISECONDS.toDays(lSecondDate - lFirstDate))) + } + + @After + fun cleanUp() { + unmockkAll() + } +} diff --git a/README.md b/README.md index 9a66237925e9bf532f606d78b05725e86fa9ccde..8c8c2fcb02ab0014fa9153e7170eb4c9e95def2c 100644 --- a/README.md +++ b/README.md @@ -31,16 +31,12 @@ The goal of this project is to develop the official Corona-Warn-App for Germany ## Known Issues * The Exposure Notification API is going to block you from successfully testing the Application unless you are whitelisted inside GMS. -* The Submission Flow is currently not working inside the Test Fragment and is heavily WIP. -* The Exception Handler is heavily WIP and may not include every exception and thus some Toasts (temporary) might not show the error or cause crashes, this also applies to error handling in general. * The Storage is currently based on Encrypted Shared Preferences and SQL Cipher (SQLite) - this could change in the future -* The App could crash, it is generally heavily WIP. We do not guarantee stability right now. * Test Coverage is generally low and needs to be improved. We appreciate your help here! * In General every TODO can be regarded as an issue. You are free to tackle the TODO's anytime! * We are aware of the Play Store Limitations of GMS. * Without your own server instance (e.g. a local Docker setup), you will not be able to test the Application. For help, please refer to the [server implementation](https://github.com/corona-warn-app/cwa-server). -* Strings in general are WIP, the base language is German, the English translation will be provided by SAP. -* Application design is WIP (e.g. colors, fonts, screen layout) and will be provided once it is final. +* Strings including translations are handled separately, for suggestions / findings please have a look at issue #332 ## Architecture & Documentation