diff --git a/Corona-Warn-App/build.gradle b/Corona-Warn-App/build.gradle index 44a518a78df812e806689700f74ca66abcd7aca7..4cd9677b71d06f64ade1f766fc3fd07bcbf62d70 100644 --- a/Corona-Warn-App/build.gradle +++ b/Corona-Warn-App/build.gradle @@ -32,14 +32,14 @@ android { applicationId 'de.rki.coronawarnapp' minSdkVersion 23 targetSdkVersion 29 - versionCode 18 - versionName "0.8.11" + versionCode 19 + versionName "0.8.12" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" buildConfigField "String", "DOWNLOAD_CDN_URL", "\"$DOWNLOAD_CDN_URL\"" buildConfigField "String", "SUBMISSION_CDN_URL", "\"$SUBMISSION_CDN_URL\"" buildConfigField "String", "VERIFICATION_CDN_URL", "\"$VERIFICATION_CDN_URL\"" - buildConfigField "String", "EXPORT_SIGNATURE_ID", "\"de.rki.coronawarnapp\"" + buildConfigField "String", "EXPORT_SIGNATURE_ID", "\"de.rki.coronawarnapp-dev\"" javaCompileOptions { annotationProcessorOptions { diff --git a/Corona-Warn-App/config/detekt.yml b/Corona-Warn-App/config/detekt.yml index 16a273985e2f434472dd1d4104a14236a9b48df4..1a5fd4a6d97d1f13e143788f0f59c9d3b2bdc5cc 100644 --- a/Corona-Warn-App/config/detekt.yml +++ b/Corona-Warn-App/config/detekt.yml @@ -521,7 +521,8 @@ style: '**/*.Spec.kt', '**/*.Spek.kt', '**/CwaWebException.kt', - '**/HttpErrorParser.kt' + '**/HttpErrorParser.kt', + '**/ErrorCodes.kt' ] ignoreNumbers: ['-1', '0', '1', '2'] ignoreHashCodeFunction: true diff --git a/Corona-Warn-App/src/main/assets/privacy_en.html b/Corona-Warn-App/src/main/assets/privacy_en.html new file mode 100644 index 0000000000000000000000000000000000000000..e56136dccee6627e424dad70a3b4ef9cdb09594f --- /dev/null +++ b/Corona-Warn-App/src/main/assets/privacy_en.html @@ -0,0 +1,742 @@ +<p> + Privacy notice +</p> +<p> + Corona-Warn-App +</p> +<p> + This privacy notice explains what data is collected when you use the + Corona-Warn-App, how that data is used, and your rights under data + protection law. +</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. +</p> +<h2> + 1. Who has provided you with this app? +</h2> +<p> + The Corona-Warn-App (the “<strong>App</strong>â€) is provided by the Robert + Koch Institute, Nordufer 20, 13353 Berlin (the “<strong>RKI</strong>â€). +</p> +<p> + The RKI is also what is called the controller under data protection law, + meaning it is responsible for the processing of App users’ data. +</p> +<p> + You can contact the RKI’s data protection officer at the above address + (“FAO the data protection officerâ€) and by emailing: datenschutz@rki.de. +</p> +<h2> + 2. Is using the App voluntary? +</h2> +<p> + Using the App is entirely voluntary. It is your decision alone whether and + how you use the App. +</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: +</p> +<ul> + <li> + Registering a test (see 6 b.) + </li> + <li> + Sharing your test result (see 6 c.). + </li> +</ul> +<p> + The data processing performed in connection with these features is + described in more detail in the following sections. +</p> +<h2> + 3. On what legal basis is your data processed? +</h2> +<p> + In principle, the RKI will process your personal data only on the basis of + your consent granted pursuant to Article 6(1) Sentence 1(a) and Article + 9(2)(a) of the General Data Protection Regulation (GDPR). If you have + granted your consent, you can withdraw it at any time. Further information + on your right of withdrawal and instructions on how to exercise this right + can be found under 11. +</p> +<h2> + 4. Who is the App aimed at? +</h2> +<p align="left"> + The App is aimed at people who are resident in Germany and at least 16 + years old. +</p> +<h2> + 5. What personal data is processed? +</h2> +<p> + The App is designed to process as little personal data as possible. This + means, for example, that the App does not collect any data that would allow + the RKI or other users to infer your identity, health status or location. + In addition, the App deliberately refrains from using tracking tools to + record or analyse how you use the App. +</p> +<p> + The data processed by the App can be grouped into the following categories: +</p> +<h3> + 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: +</p> +<ul> + <li> + IP address + </li> + <li> + Date and time of retrieval (time stamp) + </li> + <li> + Transmitted data volume (or packet length) + </li> + <li> + Notification of successful retrieval + </li> + <li> + Requesting domain + </li> + <li> + Operating system used + </li> + <li> + Device type (smartphone), the manufacturer and the model of your + smartphone (e.g. iPhone 7 or Galaxy S9). + </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. +</p> +<p> + Access data is generated when you use or enable the following features: +</p> +<ul type="disc"> + <li> + Risk identification + </li> + <li> + Registering a test + </li> + <li> + Sharing your test result. + </li> +</ul> +<h3> + b. Contact data +</h3> +<p> + 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 + 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"> + <li> + Date of the contact + </li> + <li> + Duration of the contact + </li> + <li> + Bluetooth signal strength of the contact. + </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. +</p> +<p> + The functionality used to record encounters with other users is called + “COVID-19 Exposure Notifications†on Android smartphones and “COVID-19 + Exposure Logging†on iPhones. Please note that this exposure logging + functionality is not part of the App, but an integral part of your + smartphone's operating system. This means that the exposure logging + functionality is provided to you by Apple (iPhones) or Google (Android + smartphones) and is subject to these companies’ respective privacy + policies. The RKI has no influence on data processing performed by the + operating system in connection with exposure logging. +</p> +<p> + More information about the exposure logging functionality on Android + smartphones is available at: https://support.google.com/android/answer/9888358?hl=en. +</p> +<p> + More information about Apple’s exposure logging functionality can be found + in your iPhone’s settings under “Privacy†> “Health†> "COVID-19 + Exposure Loggingâ€. Please note that the exposure logging functionality is + only available if iOS version 13.5 or higher is installed on your iPhone. +</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. +</p> +<h3> + c. Health data +</h3> +<p> + Health data is any data containing information about the health of a + particular individual. This includes not only information about past and + current illnesses, but also about a person’s risk of illness (such as the + risk that the person has been infected with the coronavirus). +</p> +<p> + Your health data will be processed in the following cases: +</p> +<ul> + <li> + If the risk identification feature detects that you may have been in + contact with a person who has been infected with the coronavirus. + </li> + <li> + If you register your test. + </li> + <li> + If you share a positive test result. + </li> +</ul> +<h2> + 6. App features +</h2> +<h3> + a. Risk identification +</h3> +<p> + The App’s core functionality is risk identification. 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. +</p> +<p> + In the event of a contact, the App analyses the contact data provided by + the exposure logging functionality in order to determine your individual + risk of infection. The evaluation algorithm which determines how the + contact data is interpreted (for example, how the duration of a contact + influences the risk of infection) is based on current scientific findings. + 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. +</p> +<p> + The identification of your risk of infection is only carried out locally on + your smartphone, meaning that the data is processed offline. Once + identified, the risk of infection is also only stored in the App and is not + passed on to any other recipients (including the RKI, Apple, Google and + other third parties). +</p> +<p> + 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. +</p> +<h3> + b. Registering a test +</h3> +<p> + If you have been tested for the coronavirus, you can register the test in + the App by scanning the QR code which you received from your doctor or the + testing facility. The app will then inform you as soon as the test result + is available from the laboratory. +</p> +<p> + For this to work, the testing laboratory needs to be connected to the App’s + server system and, as part of the testing procedure, you must have agreed + separately to the laboratory transmitting your test result to the App’s + server system (test result database). Test results from laboratories that + are not connected to the App’s server system cannot be displayed in the + App. If you have not received a QR code, the testing laboratory is not + connected. In this case you will not be able to use this feature. +</p> +<p> + <u>Registering a test</u> +</p> +<p> + To receive the test result in the App, you must first register the test you + have taken in the App. For this purpose, your doctor or the testing + facility will provide you with a QR code when taking the sample. This QR + code contains a code number which can be read with a QR code scanner. To + register your test, you will need to scan the QR code in the App using your + smartphone’s camera. +</p> +<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. +</p> +<p> + This completes the registration of your test. +</p> +<p> + <u>Filing of the test result</u> +</p> +<p> + As soon as the testing laboratory receives the test result, it stores the + result in the RKI’s test result database, indicating the hashed code + number. The test result database is operated by the RKI on a special server + within the App’s server system. Based on the code number contained in the + QR code issued to you, the testing laboratory also generates the hashed + code number using the same mathematical procedure as the App.<u></u> +</p> +<p> + <u>Retrieval of the test result</u> +</p> +<p> + Using the token, the App regularly requests the status of the registered + test from the App’s server system. The server system then assigns the token + to the hashed code number and transfers it to the test result database. If + the test result has now been stored there, the test result database sends + the test result back to the server system, which forwards it to the App + without gaining any knowledge of the content. +</p> +<p> + If the test result is positive, the App uses the token again to request a + TAN (transaction number) from the server system. The server system + reassigns the token to the hashed code number and requests confirmation + from the test result database that a positive test result exists for the + hashed code number. If the test result database confirms this, the server + system generates the TAN and transmits it to the App. A copy of the TAN + remains on the server system. +</p> +<p> + The TAN is required to ensure that no false information is distributed to + other users in the event of a positive test result being transmitted. +</p> +<p> + The legal basis for the processing described above of the data mentioned + above is your consent to using the test registration feature. +</p> +<h3> + 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. +</p> +<p> + <u>If you have not retrieved your test result in the App:</u> +</p> +<p> + Even if you have not retrieved a positive test result in the app, you can + share the test result via the App to warn other users. In this case, the + App prompts you to enter a so-called TeleTAN, which acts as a TAN. +</p> +<p> + To obtain a TeleTAN, please call the Corona-Warn-App hotline on +49 (0)800 + 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 + 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 + and deleted within one hour at the latest. +</p> +<p> + After your call, the hotline employee will generate a TeleTAN via a special + access to the App’s server system and then call you to tell you the + TeleTAN. If you enter the TeleTAN in the App, the TeleTAN will be sent back + from the App to the App’s server system for comparison and verification. In + return, the App receives a token from the server system, i.e. a digital + access key that is stored in the App. Using this token, the App then + requests a TAN from the server system. +</p> +<p> + The legal basis for this processing of your access data and health data + (random IDs, test result, TAN and, if applicable, TeleTAN) is your consent + to using the feature for sharing your test result. +</p> +<h3> + d. Using the App for information purposes only +</h3> +<p> + 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. +</p> +<h2> + 7. What permissions and functionality does the App require? +</h2> +<p> + The App requires access to a number of your smartphone’s features and + interfaces. For this purpose, you need to grant the App certain + permissions. Permissions are programmed differently by different + manufacturers. For example, individual permissions may be combined into + permission categories, where you can only agree to the permission category + as a whole. Please note that if the App is denied access, you will not be + able to use any or all of the App’s features. +</p> +<h3> + a. Technical requirements (all smartphones) +</h3> +<ul> + <li> + Internet + </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. +</p> +<ul> + <li> + Bluetooth + </li> +</ul> +<p> + Your smartphone’s Bluetooth interface must be enabled for your smartphone + to record random IDs from other smartphones and store them in the device’s + exposure log. +</p> +<ul> + <li> + Camera + </li> +</ul> +<p> + Your smartphone requires a camera to be able to scan a QR code when + registering a test. +</p> +<ul> + <li> + Background operation + </li> +</ul> +<p> + The App runs in the background (i.e. when you are not actively using the + App) in order to be able to automatically identify your risk and query the + status of a registered test. If you deny the App permission to run in the + background in your smartphone’s operating system, then you must start all + actions in the App itself. +</p> +<h3> + b. Android smartphones +</h3> +<p> + If you are using an Android device, the following system features must also + be enabled: +</p> +<ul> + <li> + COVID-19 Exposure Notifications + </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. +</p> +<ul> + <li> + Location + </li> +</ul> +<p> + Your smartphone’s location service must be enabled for your device to + search for Bluetooth signals from other smartphones. Please note that no + location data is collected in this process. +</p> +<ul> + <li> + Notification + </li> +</ul> +<p> + The user is notified locally of the identified risk and available test + results. The necessary notification function is already enabled in the + operating system. +</p> +<p> + The App also requires the following permissions: +</p> +<ul> + <li> + Camera + </li> +</ul> +<p> + The App requires access to the camera to read the QR code when registering + a test. +</p> +<h3> + c. iPhones (Apple iOS) +</h3> +<p> + If you are using an iPhone, the following system features must be enabled: +</p> +<ul> + <li> + COVID-19 Exposure Logging + </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. +</p> +<ul> + <li> + Notifications + </li> +</ul> +<p> + The user is notified locally of the identified risk and available test + results. Notifications must be enabled for this. +</p> +<p> + The App also requires the following permissions: +</p> +<ul> + <li> + Camera + </li> +</ul> +<p> + The App requires access to the camera to read the QR code when registering + a test. +</p> +<h2> + 8. When will data be deleted? +</h2> +<p> + All data stored in the App is deleted as soon as it is no longer needed for + the App features: +</p> +<h3> + a. Risk identification +</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. + </li> + <li> + The RKI has no way of influencing the deletion of contact data in your + smartphone’s exposure log (including your own random IDs) and contact + data on other smartphones, as this functionality is provided by Apple + or Google. In this case, the deletion depends on what Apple or Google + has determined. Currently, the data is automatically deleted after 14 + days. It may also be possible, using the functionality provided by + Apple and Google, to manually delete data in your device’s system + 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. + </li> +</ul> +<h3> + b. Registering a test +</h3> +<ul> + <li> + The hashed code number will be deleted from the App’s server system + after 21 days. + </li> + <li> + In the event of a negative test result, the hashed code number and the + test result will be deleted from the test result database immediately + after the test result is retrieved; and in the event of a positive test + result, they will be deleted immediately after the copy of the TAN + stored on the server system is deleted (see below). + </li> + <li> + The token stored on the server system will be deleted after 21 days. + </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. + </li> +</ul> +<h3> + c. Sharing your test result +</h3> +<ul> + <li> + Your smartphone’s own random IDs which are shared in the App will be + deleted from the server system after 14 days. + </li> + <li> + The copy of the TAN stored on the server system will be deleted after + 21 days. + </li> + <li> + The TAN stored in the App will be deleted after the test result has + been shared. + </li> + <li> + The TeleTAN stored in the App will be deleted after the test result has + been shared. + </li> + <li> + The TeleTAN stored on the server system will be deleted after 21 days. + </li> + <li> + The TeleTAN sent to the hotline employee will be deleted there + immediately after it has been passed on to you by telephone. + </li> + <li> + The token stored on the server system will be deleted after 21 days. + </li> + <li> + The token stored in the App will be deleted after the test result has + been shared. + </li> +</ul> +<h2> + 9. Who will receive your data? +</h2> +<p> + If you share a test result to warn other users, your random IDs from the + 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). +</p> +<p> + Otherwise, the RKI will only pass on personal data collected in connection + with your use of the App to third parties if the RKI is legally obliged to + do so or if this is necessary for legal action or criminal prosecution in + the case of attacks on the App’s technical infrastructure. In other cases, + personal data will not generally be passed on. +</p> +<h2> + 10. Is data transferred to a third country? +</h2> +<p> + The data generated when the App is used is processed exclusively on servers + in Germany or in another EU or EEA member state. +</p> +<h2> + 11. Withdrawal of consent +</h2> +<p> + You have the right to withdraw any consent you granted the RKI in the App + at any time with effect for the future. Please note that this will not + 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. +</p> +<p> + To withdraw your consent to the test registration feature, you can delete + the test registration in the App. The token for retrieving the test result + will then be deleted from your device. Neither the RKI nor the testing + laboratory can then assign the transmitted data to your App or smartphone. + If you wish to register another test, you will be asked to grant your + consent again. +</p> +<p> + To withdraw your consent to the sharing of your test result, you must + delete the App. All of your random IDs stored in the App will then be + removed and can no longer be assigned to your smartphone. If you wish to + report another test result, you can reinstall the App and grant your + consent again. Alternatively, you may be able to delete your own random IDs + in the exposure log in your smartphone’s system settings. Please note that, + once transmitted, the RKI has no way of deleting your random IDs from the + lists and from other users’ smartphones. +</p> +<h2> + 12. Your other rights under data protection law +</h2> +<p> + If the RKI processes your personal data, you also have the following data + protection rights: +</p> +<ul> + <li> + 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 + </li> + <li> + the right to lodge a complaint with a competent data protection + authority. To do so, you can either contact your local supervisory + authority or the competent authority at the RKI’s headquarters. The + competent supervisory authority for the RKI is the Federal Commissioner + for Data Protection and Freedom of Information, Graurheindorfer Straße + 153, 53117 Bonn. + </li> +</ul> +<p> + Please note that the RKI can only fulfil the rights mentioned above if the + data on which your claim is based can be clearly assigned to you. This + would only be possible if the RKI were to collect further personal data + that would allow the data mentioned above to be clearly assigned to you or + your smartphone. Since this is not necessary – and not intended – for the + purposes of the App, the RKI is not obliged to collect such additional data + (Article 11(2) GDPR). Moreover, this would run counter to the stated + objective of keeping the amount of data processed for the App as low as + possible. Against this backdrop, it will not normally be possible to + directly fulfil the above data protection rights under Articles 15, 16, 17, + 18, 20 and 21 GDPR, as doing so would require additional information about + you which is not available to the RKI. +</p> +<p> + Last amended: 5 June 2020 +</p> \ No newline at end of file diff --git a/Corona-Warn-App/src/main/assets/technical_en.html b/Corona-Warn-App/src/main/assets/technical_en.html new file mode 100644 index 0000000000000000000000000000000000000000..303c1d8fac3e39e6f3618ad8ec9cbba90fecf904 --- /dev/null +++ b/Corona-Warn-App/src/main/assets/technical_en.html @@ -0,0 +1,348 @@ +<h2>ThirdPartyNotices</h2> +<p>corona-warn-app/cwa-app-android uses third-party software or other resources that + may be distributed under licenses different from corona-warn-app/cwa-app-android + software. + In the event that we overlooked to list a required notice, please bring this + to our attention by contacting us via this email: + corona-warn-app.opensource@sap.com</p> +<h2>Components:</h2> +<p>Component: JUnit 4 + Licensor: The JUnit Team + Website: https://junit.org/junit4/ + License: Eclipse Public License 1.0</p> +<p>Component: Java Hamcrest + Licensor: www.hamcrest.org + Website: https://github.com/hamcrest/JavaHamcrest + License: BSD-style license</p> +<p>Component: android-database-sqlcipher + Licensor: Zetetic LLC + Website: https://www.zetetic.net/sqlcipher/ + License: BSD-style license</p> +<p>Component: guava + Licensor: Google + Website: https://github.com/google/guava + License: Apache 2.0</p> +<p>Component: joda-time + Licensor: Joda.org + Website: https://www.joda.org/joda-time/ + License: Apache 2.0</p> +<p>Component: Mockito + Licensor: Mockito contributors + Website: https://site.mockito.org/ + License: MIT</p> +<p>Component: MockK + Licensor: github.com/mockk + Website: https://github.com/mockk/mockk + License: Apache 2.0</p> +<p>Component: Robolectric + Licensor: Xtreme Labs, Pivotal Labs and Google Inc. + Website: https://robolectric.org/ + License: MIT</p> +<p>Component: RootBeer + Licensor: Scott Alexander-Bown, Mat Rollings + Website: https://github.com/scottyab/rootbeer + License: Apache 2.0</p> +<p>Component: Zxing + Licensor: zxing + Website: https://github.com/zxing/zxing/ + License: Apache 2.0</p> +<p>Component: ZXing Android Embedded + Licensor: ZXing authors, Journey Mobile + Website: https://github.com/journeyapps/zxing-android-embedded + License: Apache 2.0</p> +<p>Component: Detekt + Licensor: detekt + Website: https://detekt.github.io/detekt/ + License: Apache 2.0</p> +<p>Component: gson + Licensor: Google + Website: https://github.com/google/gson + License: Apache 2.0</p> +<p>Component: okhttp + Licensor: square + Website: https://square.github.io/okhttp/ + License: Apache 2.0</p> +<p>Component: kotlinx.coroutines + Licensor: Kotlin + Website: https://github.com/Kotlin/kotlinx.coroutines + License: Apache 2.0</p> +<p>Component: Ktlint Gradle + Licensor: Jonathan Leitschuh + Website: https://github.com/JLLeitschuh/ktlint-gradle + License: MIT</p> +<p>Component: Retrofit + Licensor: square + Website: https://square.github.io/retrofit/ + License: Apache 2.0</p> +<p>Component: Protobuf gradle plugin + Licensor: Google + Website: https://github.com/google/protobuf-gradle-plugin + License: BSD 3-Clause</p> +<p>Copyright (c) 2008-2020 Zetetic LLC + All rights reserved.</p> +<p>Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met:</p> +<pre><code> * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the ZETETIC LLC nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. +</code></pre><p>THIS SOFTWARE IS PROVIDED BY ZETETIC LLC ''AS IS'' AND ANY + EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL ZETETIC LLC BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.</p> +<p>Apache License 2.0 (guava, joda-time, MockK, RootBeer, Zxing, ZXing Android Embedded, Detekt, + gson, okhttp, kotlinx.coroutines, Retrofit)</p> +<pre><code> Apache License + Version 2.0, January 2004 + https://www.apache.org/licenses/ +</code></pre><p> TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION</p> +<ol> + <li><p>Definitions.</p> + <p>"License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document.</p> + <p>"Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License.</p> + <p>"Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity.</p> + <p>"You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License.</p> + <p>"Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files.</p> + <p>"Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types.</p> + <p>"Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below).</p> + <p>"Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof.</p> + <p>"Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution."</p> + <p>"Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work.</p> + </li> + <li><p>Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form.</p> + </li> + <li><p>Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed.</p> + </li> + <li><p>Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions:</p> + <p>(a) You must give any other recipients of the Work or</p> + <pre><code>Derivative Works a copy of this License; and +</code></pre> + <p>(b) You must cause any modified files to carry prominent notices</p> + <pre><code>stating that You changed the files; and +</code></pre> + <p>(c) You must retain, in the Source form of any Derivative Works</p> + <pre><code>that You distribute, all copyright, patent, trademark, and +attribution notices from the Source form of the Work, +excluding those notices that do not pertain to any part of +the Derivative Works; and +</code></pre> + <p>(d) If the Work includes a "NOTICE" text file as part of its</p> + <pre><code>distribution, then any Derivative Works that You distribute must +include a readable copy of the attribution notices contained +within such NOTICE file, excluding those notices that do not +pertain to any part of the Derivative Works, in at least one +of the following places: within a NOTICE text file distributed +as part of the Derivative Works; within the Source form or +documentation, if provided along with the Derivative Works; or, +within a display generated by the Derivative Works, if and +wherever such third-party notices normally appear. The contents +of the NOTICE file are for informational purposes only and +do not modify the License. You may add Your own attribution +notices within Derivative Works that You distribute, alongside +or as an addendum to the NOTICE text from the Work, provided +that such additional attribution notices cannot be construed +as modifying the License. +</code></pre> + <p>You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License.</p> + </li> + <li><p>Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions.</p> + </li> + <li><p>Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file.</p> + </li> + <li><p>Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License.</p> + </li> + <li><p>Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages.</p> + </li> + <li><p>Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability.</p> + <p>END OF TERMS AND CONDITIONS</p> + </li> +</ol> +<p>The MIT License</p> +<p>Copyright (c) 2007 Mockito contributors</p> +<p>Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions:</p> +<p>The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software.</p> +<p>THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE.</p> +<p>The MIT License</p> +<p>Copyright (c) 2010 Xtreme Labs, Pivotal Labs and Google Inc.</p> +<p>Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions:</p> +<p>The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software.</p> +<p>THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE.</p> +<p>MIT License</p> +<p>Copyright (c) 2020 Jonathan Leitschuh</p> +<p>Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions:</p> +<p>The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software.</p> +<p>THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE.</p> +<p>BSD 3-Clause (Protobuf gradle plugin)</p> +<p>Original work copyright (c) 2015, Alex Antonov. All rights reserved. + Modified work copyright (c) 2015, Google Inc. All rights reserved.</p> +<p>Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met:</p> +<ol> + <li><p>Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer.</p> + </li> + <li><p>Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution.</p> + </li> + <li><p>Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission.</p> + </li> +</ol> +<p>THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.</p> \ No newline at end of file diff --git a/Corona-Warn-App/src/main/assets/terms_en.html b/Corona-Warn-App/src/main/assets/terms_en.html new file mode 100644 index 0000000000000000000000000000000000000000..5099d90ae9d89fa34112d7def6c7da7b9967d6f7 --- /dev/null +++ b/Corona-Warn-App/src/main/assets/terms_en.html @@ -0,0 +1,815 @@ +<p> + ENGLISH IS MISSING +</p> +<p> + 1. Welche Funktionen hat die APP? +</p> +<p> + 2. Was bedeutet niedriges oder erhöhtes Risiko? +</p> +<p> + 3. Risiko-Begegnung – was tun? +</p> +<p> + 4. Kein Infektionsschutz durch die App. +</p> +<p> + 5. Abrufen von Testergebnissen. +</p> +<p> + 6. Auslösen einer Warnung. +</p> +<p> + 7. Voraussetzungen für die Nutzung der App. +</p> +<p> + 8. Grenzen der App. +</p> +<p> + 9. Nutzungsrechte. +</p> +<p> + 10. Wichtige Hinweise zu Verfügbarkeit und Änderungen. +</p> +<p> + 11. Keine Gewährleistung. +</p> +<p> + 12. Besondere Bedingungen für die iOS-Version der App. +</p> +<p> + 13. Schlussbestimmungen. +</p> +<p> + Herausgeber der App ist das +</p> +<p> + Robert Koch-Institut +</p> +<p> + Nordufer 20 +</p> +<p> + 13353 Berlin ("<strong>RKI</strong>") +</p> +<p> + vertreten durch den Präsidenten. Für Fragen, Beschwerden und Ansprüche im + Zusammenhang mit diesen Nutzungsbedingungen können Sie das RKI telefonisch + unter +49 30 18754-5100 und per E-Mail unter CoronaWarnApp@rki.de + erreichen. +</p> +<p> + Bitte lesen Sie diese Nutzungsbedingungen sorgfältig. Diese + Nutzungsbedingungen regeln Ihre Nutzung der Corona Warn App einschließlich + der Nutzung zukünftiger Versionen (Patches, Updates und Upgrades) ("<strong>App</strong>") und + der Nutzung weiterer Dienste (" <a name="_Hlk41947003"><strong>CWA-Dienste</strong></a>"), die + derzeit oder + zukünftig vom RKI im Zusammenhang mit der App bereitgestellt werden. Die + separate Datenschutzerklärung (siehe <strong>[<em>Link</em>]</strong>) ist + Bestandteil dieser Nutzungsbedingungen. Bitte lesen Sie auch die + Datenschutzerklärung sorgfältig. +</p> +<p> + Die App ist für die Nutzung auf iOS-Geräten im Apple App Store verfügbar + und für die Nutzung auf Android-Geräten bei Google Play. Allgemeine + Nutzungsbedingungen für Applikationen von Apple oder Google finden im + Verhältnis zum RKI keine Anwendung. Das RKI ist allein verantwortlich für + die Inhalte der App sowie deren Wartung und Pflege und für Ansprüche, die + Sie ggf. in Bezug auf die App haben. +</p> +<p> + Mit der Installation und Nutzung der App erklären Sie sich mit diesen + Nutzungsbedingungen einverstanden. Sollten Sie mit den Nutzungsbedingungen + nicht einverstanden sein, dürfen Sie die App nicht installieren oder nutzen + (bzw. müssen diese wieder löschen) und dürfen auch die die damit + verbundenen Dienste und Systeme nicht nutzen. Etwaige Rechte unter Open + Source-Lizenzen in Bezug auf den Quellcode der App bleiben hiervon + unberührt. +</p> +<p> + Sie sind für die Einhaltung dieser Nutzungsbedingungen auch dann + verantwortlich, wenn Sie das Endgerät, auf dem Sie die App installiert + haben, Dritten überlassen und diese die App verwenden. +</p> +<p> + Die App richtet sich an Personen, die mindestens 16 Jahre alt sind. + Personen unter 16 Jahren dürfen die App nur mit Zustimmung ihres/ihrer + Sorgeberechtigten verwenden. +</p> +<p> + <a name="_Toc42328034">1. Welche Funktionen hat die APP?</a> +</p> +<p> + Ziel der Corona Warn App ist es, SARS-CoV-2-Infektionsketten frühzeitig zu + durchbrechen. Personen sollen möglichst zuverlässig und schnell über + Begegnungen mit infizierten Personen und damit mögliche Ãœbertragungen des + Virus informiert werden, damit sie sich freiwillig isolieren können, um + damit zu einer Eindämmung der SARS-CoV-2-Pandemie beizutragen. +</p> +<p> + Die wesentlichen Funktionen der App sind nachstehend beschrieben. Hierbei + handelt es sich um eine Beschreibung zu Ihrer Information und nicht um eine + Beschaffenheitsvereinbarung oder die Vereinbarung bestimmter Funktionen, + bitte beachten Sie die diesbezüglichen Hinweise und Vorbehalte unter Ziffer + 10. +</p> +<p> + Hintergrund +</p> +<p> + Die App läuft auf dem Endgerät im Hintergrund und speichert automatisiert + und verschlüsselt die Zufallscodes (<em>rolling proximity identifier</em>) + anderer in der Nähe befindlicher Endgeräte. In regelmäßigen Abständen holt + sich die App über die CWA-Dienste eine Liste der Zufallscodes (<em>t</em> <em>emporary exposure + keys</em>) der Personen, die sich freiwillig + infiziert gemeldet haben, und vergleicht diese mit den gespeicherten + Zufallscodes im Gerät, um eine Risiko-Begegnung zu ermitteln. +</p> +<p> + Die App kann nur Begegnungen mit Personen registrieren, die ihrerseits ein + Endgerät mit installierter App bei sich führen und alle Voraussetzungen für + die Nutzung der App erfüllen (siehe unten Ziffer 7). Begegnungen mit + anderen Personen kann die App nicht registrieren. +</p> +<p> + Risikobenachrichtigung +</p> +<p> + Bei einer festgestellten Risiko-Begegnung zu positiv getesteten Personen + erhalten Sie eine Benachrichtigung und verhaltensbezogene Empfehlungen. + Hier kann zum Beispiel die Kontaktaufnahme mit ärztlichem Fachpersonal, mit + dem zuständigen Gesundheitsamt und/oder die freiwillige häusliche Isolation + empfohlen werden. +</p> +<p> + Benachrichtigung über Testergebnisse +</p> +<p> + Ab dem Zeitpunkt der Probenabgabe für einen Test auf eine + SARS-CoV-2-Infektion können Sie über die App den digitalen + Testinformationsprozess starten und damit über das Testergebnis + benachrichtigt werden. Die App übermittelt lediglich das vom jeweiligen + Labor mitgeteilte Testergebnis. Das RKI ist weder für die Durchführung des + Tests noch für den Inhalt des Testergebnisses verantwortlich. +</p> +<p> + Infektfall +</p> +<p> + Im Fall eines positiven SARS-CoV-2-Befunds können Sie freiwillig die in der + App gespeicherten eigenen Zufallscodes der letzten 14 Tage als + Positivkennungen (<em>diagnosis keys</em>) veröffentlichen, damit andere + Personen, die die App nutzen, auf ihrem eigenen Endgerät abgleichen können, + ob sie mit Ihnen eine Risiko-Begegnung hatten. +</p> +<p> + Technische Beschreibung der App +</p> +<p> + Die technischen Funktionen der App sowie der damit verbundenen Dienste und + Systeme sind unter folgendem Link detailliert beschrieben: +</p> +<p> + https://github.com/Corona-Warn-App +</p> +<p> + Diese technische Beschreibung dient lediglich der Erläuterung und ist nicht + Bestandteil dieser Nutzungsbedingungen. Sie stellt auch keine + Beschaffenheitsvereinbarung in Bezug auf die App dar. +</p> +<p> + Weiterführende Informationen +</p> +<p> + Weiterführende Informationen zur App finden Sie unter folgendem Link: + <strong>[<em>Link</em>]</strong> +</p> +<p> + Weiterführende Informationen zur SARS-CoV-2-Pandemie finden Sie unter + folgendem Link: + https://www.zusammengegencorona.de/ +</p> +<p> + Diese weiterführenden Informationen dienen lediglich der Erläuterung und + sind nicht Bestandteil dieser Nutzungsbedingungen. +</p> +<p> + <a name="_Toc42328035">2. Was bedeutet niedriges oder erhöhtes Risiko?</a> +</p> +<p> + Die App berechnet auf Basis der festgestellten Begegnungen ein indikatives + individuelles Risiko. Hierbei werden Faktoren wie der Zeitraum seit der + Begegnung (<em>days since exposure</em>), die Dauer der Begegnung ( <em>exposure duration</em>), + die ungefähre Nähe zur infizierten Person, + basierend auf der gemessenen Dämpfung des Bluetooth-Signals (<em>signal attenuation</em>) sowie + ggf. Ãœbertragungsrisiken ( <em>transmission risk</em> berücksichtigt. Auf dieser Basis wird + Ihnen in + der App entweder ein "niedriges Risiko" oder ein "erhöhtes Risiko" + angezeigt. Es handelt sich hierbei um einen rein indikativen Wert auf der + Grundlage der erfassten Daten. + <strong> + Eine Aussage über das Vorliegen einer tatsächlichen Infektion mit + SARS-CoV-2 ist hiermit nicht verbunden. + </strong> + Auch bei der Angabe eines "niedrigen Risikos" kann eine Infektion + vorliegen, während auch bei Angabe eines "erhöhten Risikos" eine Infektion + nicht gegeben sein kann. +</p> +<p> + <strong> + Andere Faktoren können Ihr persönliches Infektionsrisiko erheblich + beeinflussen. Diese werden von der App nicht berücksichtigt. + </strong> + Das sind insbesondere Ihre persönlichen Umstände, die äußeren Umstände + einer Risiko-Begegnung mit einer infizierten Person, Ihr persönliches + Verhalten sowie Begegnungen mit Dritten, die von der App nicht erfasst + wurden. Bitte beachten Sie die Hinweise in Ziffer 4. +</p> +<p> + <a name="_Toc42328036">3. Risiko-Begegnung – was tun?</a> +</p> +<p> + Wenn Sie über die App eine Benachrichtigung über eine festgestellte + Risiko-Begegnung mit infizierten Personen erhalten, erhalten Sie + verhaltensbezogene Empfehlungen in der Benachrichtigung. Diese Empfehlungen + sind rechtlich nicht verbindlich, ihre Befolgung wird aber vom RKI + empfohlen. Gesetzliche und vertragliche Pflichten sowie behördliche + Anordnungen für den Fall einer Risiko-Begegnung mit infizierten Personen + bleiben unberührt und müssen von Ihnen unabhängig von diesen Empfehlungen + befolgt werden. +</p> +<p> + <strong> + Innerhalb oder über die App erfolgt keinerlei medizinische Diagnose. + </strong> +</p> +<p> + <strong> + Die Benachrichtigung bedeutet nicht, dass Sie sich mit SARS-CoV-2 + infiziert haben. + </strong> + Sie besagt lediglich, dass sie während der letzten 14 Tage eine + Risiko-Begegnung mit einer anderen Person hatten, bei der eine + SARS-CoV-2-Infektion positiv festgestellt wurde. Hieraus ergibt sich für + Sie zunächst nur eine Möglichkeit, dass Sie sich ebenfalls infiziert haben + könnten. Die Einstufung des diesbezüglichen Risikos als "niedrig" oder + "erhöht" erfolgt allein auf der Basis der ermittelten Daten und lässt keine + Aussage über das tatsächliche Vorliegen einer Infektion zu. +</p> +<p> + <strong> + Die Benachrichtigung über eine Risiko-Begegnung kann unzutreffend sein. + </strong> + Die Risiko-Begegnung kann von Ihrem Endgerät beispielsweise zu einem + Zeitpunkt registriert worden sein, zu dem Sie sich nicht in der Nähe Ihres + Endgeräts aufgehalten haben oder während eine andere Person Ihr Endgerät + verwendet hat. Die Risiko-Begegnung kann auch aufgrund bestehender Grenzen + bei der Kontaktmessung fälschlicherweise registriert worden sein (siehe + unten Ziffer 8). +</p> +<p> + <a name="_Toc42328037"></a> + <a name="_Ref41775531">4. Kein Infektionsschutz durch die App</a> +</p> +<p> + Die App dient der Unterbrechung von Infektionsketten. +</p> +<ul> + <li> + <strong> + Die App schützt Sie nicht vor einer SARS-CoV-2-Infektion. + </strong> + </li> + <li> + <strong> + Die App reduziert Ihr persönliches Infektionsrisiko nicht. + </strong> + </li> + <li> + <strong> + Sie können sich auch mit SARS-CoV-2 infizieren, ohne dass die App + Sie über die Risiko-Begegnung mit der Person benachrichtigt, die + Sie infiziert hat: + </strong> + </li> +</ul> +<p> + o Die App registriert nicht alle Ihre Begegnungen mit anderen Personen, + z.B. weil andere Personen die App nicht verwenden, Sie Ihr Endgerät nicht + immer bei sich tragen oder die App nicht immer in Betrieb haben oder weil + die Kontaktmessung gewissen Grenzen unterliegt (siehe unten Ziffer 8). +</p> +<p> + o Die App informiert Sie nur über festgestellte Risiko-Begegnungen mit + infizierten Personen. Das setzt voraus, dass die App die Begegnung mit der + infizierten Person registriert hat <u>und</u> die infizierte Person eine + Warnung über die App auslöst. Das Auslösen der Warnung ist freiwillig und + erfolgt möglicherweise nicht durch alle infizierten Personen. +</p> +<p> + Bitte halten Sie auch bei Verwendung der App die sonstigen + Vorsichtsmaßnahmen und behördlichen Anordnungen ein. Verlässliche + Informationen über die SARS-CoV-2-Pandemie und Vorsichtsmaßnahmen finden + Sie unter anderem auf: +</p> +<p> + www.infektionsschutz.de/coronavirus +</p> +<p> + www.zusammengegencorona.de +</p> +<p> + www.rki.de/covid-19 +</p> +<p> + Diese weiterführenden Informationen dienen lediglich Ihrer Information und + sind nicht Bestandteil dieser Nutzungsbedingungen. +</p> +<p> + Halten Sie sich auch bei Verwendung der App an die <strong>AHA-Regeln</strong>: +</p> +<p> + <strong>A</strong> + ✋ - Halten Sie mindestens 1,5m Abstand zu Ihren Mitmenschen +</p> +<p> + <strong>H</strong> + � - Waschen Sie sich regelmäßig für mindestens 20 Sekunden die Hände +</p> +<p> + <strong>A</strong> + � - Tragen Sie beim Einkauf und in öffentlichen Verkehrsmitteln eine + Alltagsmaske +</p> +<p> + So schützen Sie sich selbst und andere vor dem Virus. +</p> +<p> + <a name="_Toc42328038">5. Abrufen von Testergebnissen</a> +</p> +<p> + Sie dürfen über die App ausschließlich Ihre eigenen Testergebnisse abrufen. +</p> +<p> + Wenn Sie auf Testergebnisse warten und die CWA-Dienste nicht zur Verfügung + stehen oder der Abruf der Testergebnisse über die App aus sonstigen Gründen + nicht funktioniert, dann informieren Sie sich bitte über andere Kontaktwege + über das Testergebnis, z.B. über die jeweilige Teststelle wie Ihren + Hausarzt oder das örtliche Gesundheitsamt. Warten Sie nicht darauf, dass + die App wieder zur Verfügung steht. +</p> +<p> + <a name="_Toc42328039">6. Auslösen einer Warnung</a> +</p> +<p> + Sie können über die App andere Kontaktpersonen warnen, wenn Sie mit + SARS-CoV-2 infiziert wurden. <strong>Sie dürfen diese Warnung nur auslösen, wenn </strong> + <strong> + die Infektion durch einen Test in einem zugelassenen Testlabor positiv + bestätigt wurde. + </strong> +</p> +<p> + Falls das zugelassene Testlabor noch nicht an die CWA-Dienste angeschlossen + ist, erfolgt eine Ãœberprüfung Ihres Infektionsstatus über eine vom RKI + eingerichtete Verifikations-Hotline. Das Auslösen einer Warnung über die + App auf der Grundlage einer bloßen Risiko-Mitteilung ist nicht zulässig. +</p> +<p> + Bei Unsicherheit: erst Hausarzt oder Gesundheitsamt kontaktieren +</p> +<p> + Wenn Sie nicht sicher sind, ob Sie sich infiziert haben oder nicht, dann + kontaktieren Sie bitte Ihren Hausarzt oder das zuständige Gesundheitsamt, + bevor Sie eine Warnung auslösen. Hier erhalten Sie weitere Beratung und + können sich erforderlichenfalls auf eine Infektion testen lassen. In der + Zwischenzeit befolgen Sie die allgemein gültigen Empfehlungen für das + Verhalten bei dem Verdacht einer SARS-CoV-2-Infektion. +</p> +<p> + Missbrauchsverbot +</p> +<p> + <strong> + Das missbräuchliche Auslösen einer Warnung ist untersagt und kann + schwerwiegende Konsequenzen nach sich ziehen. + </strong> + Insbesondere können Sie sich eventuell gegenüber anderen betroffenen + Personen schadenersatzpflichtig machen. +</p> +<p> + Das RKI behält sich vor, Sie bei Feststellung eines missbräuchlichen + Verhaltens von der weiteren Nutzung der App und der CWA-Dienste + auszuschließen. +</p> +<p> + <a name="_Toc42328040"></a> + <a name="_Ref41851933">7. Voraussetzungen für die Nutzung der App</a> +</p> +<p> + Folgende technische Voraussetzungen sind für die Nutzung der App + erforderlich: +</p> +<p> + Sie benötigen eine Datenverbindung +</p> +<p> + Bestimmte Funktionen der App setzen auf zentrale Dienste und Systeme auf, + die über die CWA-Dienste zur Verfügung gestellt werden. Diese Funktionen + stehen daher nur zur Verfügung, wenn Ihr Endgerät über eine Datenverbindung + mit dem Internet verfügt, z.B. über UMTS, LTE oder WLAN, um hierüber auf + die CWA-Dienste zugreifen zu können. Ohne Datenverbindung stehen einige + oder alle Funktionen der App nicht zur Verfügung. Dies gilt auch, wenn Sie + Ihr Endgerät in den Flugmodus versetzen oder ausschalten. +</p> +<p> + Die App muss auf dem Endgerät laufen und eingeschaltet sein +</p> +<p> + Die App muss auf Ihrem Endgerät im Vorder- oder Hintergrund laufen und + eingeschaltet sein. Hierzu müssen Sie die App starten. Wenn Sie die App + nicht starten, ausschalten oder beenden, speichert die App keine + Begegnungen mit anderen Personen und erzeugt keine Zufallscodes zur + Speicherung durch andere Personen. Wenn Sie das Endgerät neu starten (z.B. + nach dem Ausschalten, nachdem die Batterie leer war oder nach einem Update + des Betriebssystems), müssen Sie auch die App neu starten. +</p> +<p> + Einstellungen im Endgerät +</p> +<p> + Für die Nutzung der App müssen Sie ferner die Bluetooth (BLE)-Funktionen + auf Ihrem Endgerät aktivieren und ggf. zur Verwendung durch die App + freigegeben. +</p> +<p> + Für die Nutzung der App empfiehlt das RKI ferner folgende Funktionen auf + Ihrem Endgerät zu aktivieren und ggf. zur Verwendung durch die App + freizugegeben, auch wenn diese nicht Voraussetzung für die Nutzung der + grundlegenden Funktionen der App sind: +</p> +<ul> + <li> + Benachrichtigungen + </li> + <li> + Kamerafunktion + </li> +</ul> +<p> + Bitte prüfen Sie in den Einstellungen ihres Endgeräts, ob diese Funktionen + aktiviert und für die Verwendung der App freigegeben sind. +</p> +<p> + Eine ausführliche Anleitung zur Einrichtung der App unter iOS und Android + finden Sie unter [<em>Link</em>]. Die Anleitung dient lediglich der + Erläuterung und ist nicht Teil dieser Nutzungsbedingungen. +</p> +<p> + Sie müssen immer die aktuelle Version der App verwenden +</p> +<p> + Das RKI wird von Zeit zu Zeit Updates der App zur Verfügung stellen. Sie + müssen diese Updates unverzüglich installieren und immer die neueste + verfügbare Version der App verwenden. Beim Verwenden älterer Versionen kann + es zu Fehlfunktionen und Störungen kommen. +</p> +<p> + <strong> + <em>Sie benötigen aktuelle Versionen von iOS bzw. Android</em> + </strong> +</p> +<p> + Die App verwendet eigens von Apple in iOS und Google in Android + implementierte Funktionen (<em>sog. Exposure Notification</em>). Diese + stehen in iOS erst ab Version 13.5 und in Android erst ab Version + <strong>[x]</strong><strong> </strong>zur Verfügung. Die App funktioniert + daher leider nicht mit früheren Versionen der beiden Betriebssysteme. +</p> +<p> + <a name="_Toc42328041"></a> + <a name="_Ref42018297">8. Grenzen der App</a> +</p> +<p> + Die App kann Sie dabei unterstützen, Risiko-Begegnungen mit Personen zu + erkennen, die später positiv getestet wurden. Die App hat aber auch + Grenzen, die berücksichtigt werden müssen. +</p> +<p> + Eine dieser Grenzen ist, dass die App zwar laufend eigene Zufallscodes ( <em>Rolling Proximity + Identifiers</em>) aussendet, aber andere Zufallscodes + nur in bestimmten Intervallen empfängt. Diese Empfangsfenster liegen + derzeit noch bis zu fünf Minuten auseinander und sind nur als sehr kurz + spezifiziert. In der App sind die Empfangsfenster vier Sekunden lang. +</p> +<p> + Für die Entfernungsmessung wird die Dämpfung des Bluetooth-Signals + verwendet. Eine geringere Dämpfung bedeutet dabei grundsätzlich, dass das + andere Endgerät näher ist. Eine höhere Dämpfung kann entweder bedeuten, + dass das andere Endgerät weiter entfernt ist (also eine Entfernung von mehr + als zwei Metern) oder dass sich zwischen den beiden Endgeräten etwas + befindet, was das Signal blockiert. Das können Objekte wie eine Wand oder + eine Tasche, in der sich das Endgerät befindet, sein, aber genauso Personen + oder Tiere. +</p> +<p> + <a name="_Toc42328042">9. Nutzungsrechte</a> +</p> +<p> + <strong><em>Einfaches Nutzungsrecht</em></strong> +</p> +<p> + Hiermit wird Ihnen eine eingeschränkte, nicht ausschließliche, nicht + übertragbare, nicht unterlizenzierbare, widerrufliche Lizenz zur Nutzung + der App für Ihre persönlichen, nicht kommerziellen Zwecke gewährt. +</p> +<p> + Die Lizenz für die iOS-Version der App umfasst die Nutzung auf jedem + Apple-Gerät, an dem Sie Eigentum haben oder über das Sie Kontrolle ausüben, + im Rahmen der geltenden Nutzungsbedingungen des App Stores, wobei auch über + andere Apple Accounts, die mit Ihrem Apple Account via Family Sharing oder + Volumenkauf verbunden sind, auf die App zugegriffen und diese genutzt + werden kann. +</p> +<p> + Sie dürfen im Rahmen von Datensicherungen Kopien der App anfertigen. + Darüberhinausgehende Rechte an der App werden Ihnen nicht eingeräumt. +</p> +<p> + <strong><em>Eigentum an der App</em></strong> +</p> +<p> + Die App (einschließlich des Quellcodes) ist das alleinige und + ausschließliche Eigentum von SAP SE, Dietmar Hopp Allee 16, 69190 Walldorf + („<strong>SAP</strong>“) oder deren Lizenzgebern, vorbehaltlich der Ihnen + nach Ziffer 9 eingeräumten Rechte sowie sonstiger Rechte an der App, die + SAP der Bundesrepublik Deutschland vertraglich eingeräumt hat. +</p> +<p> + <strong><em>Open Source-Lizenzhinweise</em></strong> +</p> +<p> + Information über die Verwendung von Drittkomponenten in der App und die + anwendbaren Lizenzbestimmungen finden Sie in den Open + Source-Lizenzhinweisen in der App. +</p> +<p> + Der Quellcode der App ist unter den Lizenzbedingungen der "Apache 2.0 + License" veröffentlicht und kann unter " + https://github.com/corona-warn-app + " heruntergeladen werden. Die Lizenzbedingungen der "Apache 2.0 License" + sind unter " + https://www.apache.org/licenses/LICENSE-2.0 + " abrufbar. +</p> +<p> + Die auf den Quellcode der App sowie auf in der App enthaltene + Drittkomponenten jeweils anwendbaren Lizenzbestimmungen bleiben von der + Rechteeinräumung nach dieser Ziffer 9 unberührt. +</p> +<p> + <strong><em>Was nicht erlaubt ist</em></strong> +</p> +<p> + Sie dürfen die App nicht manipulieren oder verändern. +</p> +<p> + Sie dürfen die App und die Schnittstellen zu den CWA-Diensten nicht + missbräuchlich verwenden. Sie dürfen die CWA-Dienste nicht für andere + Zwecke nutzen als den bestimmungsgemäßen Betrieb der App auf Ihrem + Endgerät. Sie dürfen auf die CWA-Dienste ausschließlich über die App + zugreifen. +</p> +<p> + <a name="_Toc42328043"></a> + <a name="_Ref41856586"> + 10. Wichtige Hinweise zu Verfügbarkeit und Änderungen + </a> +</p> +<p> + Kein Anspruch auf bestimmte Funktionalität +</p> +<p> + Die App wird Ihnen so zur Verfügung gestellt, wie sie vom RKI herausgegeben + wird. Das RKI übernimmt keine Gewähr für die Funktionsfähigkeit der App + oder der CWA-Dienste und vereinbart mit Ihnen keine bestimmte + Beschaffenheit. Sie haben keinen Anspruch auf eine bestimmte Funktionalität + oder anderweitige Beschaffenheit der App oder der CWA-Dienste. Das RKI kann + die App jederzeit ändern und Funktionen ganz oder teilweise entfernen oder + die App um zusätzliche Funktionen erweitern. +</p> +<p> + Keine Verfügbarkeitszusage +</p> +<p> + Das RKI kann den Betrieb der App und der CWA-Dienste jederzeit einschränken + oder einstellen. Es besteht Ihrerseits kein Anspruch auf die weitergehende + Verfügbarkeit der App oder der damit verbundenen Dienste und Systeme + einschließlich der CWA-Dienste, weder in Bezug auf einzelne Funktionen noch + in Bezug auf das System als Ganzes. +</p> +<p> + Das RKI macht keine Zusagen über die Verfügbarkeit oder Leistungsfähigkeit + der CWA-Dienste. Diese können aufgrund von Wartungsarbeiten oder Störungen + vorübergehend und ggf. auch für längere Zeiträume nicht zur Verfügung + stehen. In diesen Fällen ist die Funktionalität der App ganz oder teilweise + eingeschränkt. +</p> +<p> + Änderung der Nutzungsbedingungen +</p> +<p> + Das RKI behält sich vor, diese Nutzungsbedingungen zu ändern. In diesem + Fall werden Sie beim Start der App aufgefordert, den geänderten + Nutzungsbedingungen zuzustimmen. Wenn Sie den geänderten + Nutzungsbedingungen nicht zustimmen, können Sie die App und die CWA- + Dienste nicht mehr nutzen und müssen die App von Ihrem Endgerät löschen. +</p> +<p> + Risk Score +</p> +<p> + Das RKI behält sich ferner vor, die im Rahmen der Risikobewertung ( <em>risk score</em>) + verwendeten Parameter jederzeit zu ändern, um dadurch + jeweils aktuellen Forschungsergebnissen zur Virusübertragung zu + entsprechen. Das RKI bestimmt die verwendeten Parameter jeweils nach seinem + Ermessen. +</p> +<p> + <a name="_Toc42328044">11. Keine Gewährleistung</a> +</p> +<p> + Das RKI bestimmt die Funktionen der App und der CWA-Dienste sowie deren + Ausgestaltung. Das RKI vereinbart mit Ihnen keine bestimmte Beschaffenheit + und Sie haben keinen Anspruch darauf, dass die App bestimmte Funktionen hat + oder diese in bestimmter Weise ausgestaltet sind. Die App wird in dem + Zustand und mit den Funktionen zur Verfügung gestellt, wie sie beim + Veröffentlichen der App im Apple App Store oder bei Google Play durch das + RKI implementiert sind. +</p> +<p> + Das RKI wird die App mit angemessener Sorgfalt zur Verfügung stellen und + angemessene Sorgfalt hinsichtlich der CWA-Dienste anwenden. Das RKI gibt + keine sonstigen Versprechen oder Zusicherungen im Hinblick auf die App oder + die CWA-Dienste ab und gewährleistet insbesondere nicht, dass: +</p> +<p> + · Ihre Nutzung der App oder der CWA-Dienste ohne Unterbrechung möglich oder + fehlerfrei sein wird, +</p> +<p> + · die App oder die CWA-Dienste frei von Verlusten, Korruption, Angriffen, + Viren, Eingriffen, Hacking oder anderen sicherheitsrelevanten Störungen + sein werden. +</p> +<p> + Für die Datensicherung Ihres Endgeräts sowie ggf. damit verbundener Systeme + sind Sie verantwortlich, inklusive der Datensicherung sämtlicher anderer + Apps, welche auf Ihrem Endgerät gespeichert sind. +</p> +<p> + <a name="_Toc42328045"> + 12. Besondere Bedingungen für die iOS-Version der App + </a> +</p> +<p> + Die folgenden Bedingungen gelten für den Bezug der App über den Apple App + Store und die Nutzung der App unter dem Betriebssystem iOS. +</p> +<p> + Einwilligung zur Nutzung von Daten +</p> +<p> + Sie erklären sich damit einverstanden, dass das RKI technische Daten und + zugehörige Informationen – insbesondere technische Informationen über Ihr + Gerät, System und Ihre Anwendungssoftware sowie Peripheriegeräte – erheben + und nutzen darf, die in regelmäßigen Abständen erfasst werden, um die + Bereitstellung von Software-Aktualisierungen, Produkt-Support und anderen + im Zusammenhang mit der App gegenüber Ihnen erbrachten Dienstleistungen + (soweit gegeben) zu erleichtern. Das RKI darf diese Informationen nutzen, + um seine Produkte zu verbessern oder Ihnen Dienstleistungen oder + Technologien zur Verfügung zu stellen, solange dies in einer Form erfolgt, + die Ihre Identität nicht preisgibt. +</p> +<p> + Wartung und Support +</p> +<p> + Das RKI ist als Herausgeber der App allein verantwortlich für Wartung und + Support der App nach Maßgabe dieser Nutzungsbedingungen. Apple übernimmt + keinerlei Verpflichtung zur Erbringung irgendwelcher Wartungs- und + Supportleistungen in Bezug auf die App. +</p> +<p> + Keine Haftung von Apple für Störungen +</p> +<p> + Im Fall von Störungen der App steht es Ihnen frei, Apple hierüber zu + informieren. Soweit gesetzlich zulässig hat Apple keine weitergehenden + Pflichten wegen Störungen der App. +</p> +<p> + Produkthaftung +</p> +<p> + Apple ist nicht verantwortlich für etwaige Ansprüche Ihrerseits oder von + Dritten in Bezug auf die App oder deren Besitz oder Verwendung + einschließlich +</p> +<ul> + <li> + Ansprüchen wegen Produkthaftung, + </li> +</ul> +<p> + · Ansprüchen auf der Basis, dass die App anwendbare gesetzliche oder + regulatorische Anforderungen nicht erfüllt und +</p> +<p> + · Ansprüchen unter Verbrauchschutz- und Datenschutzgesetzen oder ähnlichen + Gesetzen, +</p> +<p> + einschließlich im Zusammenhang mit der Nutzung der HealthKit und + HomeKit-Frameworks. +</p> +<p> + Verletzung von Schutzrechten Dritter +</p> +<p> + Für den Fall, dass Dritte Ansprüche wegen der Verletzung von Schutzrechten + durch die App oder den Besitz oder die Verwendung der App durch Sie geltend + machen, ist Apple nicht verantwortlich für Untersuchungen, Verteidigung, + Beilegung oder Erfüllung solcher Ansprüche wegen der Verletzung von + Schutzrechten. +</p> +<p> + US Embargos und Sanktionen +</p> +<p> + Mit Anerkennen dieser Nutzungsbedingungen bestätigten Sie, +</p> +<p> + · dass Sie sich nicht in einem Land aufhalten, das einem Embargo der + Regierung der Vereinigten Staaten von Amerika unterliegt oder von der + Regierung der Vereinigten Staaten von Amerika als Unterstützer von + Terroristen (<em>"terrorist supporting" country</em>) designiert wurde und +</p> +<p> + · dass Sie nicht auf einer Liste der Regierung der Vereinigten Staaten von + Amerika als sog. <em>Prohibited or Restricted Party</em> geführt werden. +</p> +<p> + Drittbegünstigung von Apple +</p> +<p> + Sie erkennen an und erklären sich damit einverstanden, dass Apple ein + Drittbegünstigter unter diesen Nutzungsbedingungen ist und Apple daher + diese Nutzungsbedingungen Ihnen gegenüber durchsetzen kann. Die Änderung + und Aufhebung dieser Nutzungsbedingungen einschließlich der Rechte von + Apple hierunter bleibt den Vertragsparteien vorbehalten und bedarf nicht + der Zustimmung von Apple. +</p> +<p> + <a name="_Toc42328046">13. Schlussbestimmungen</a> +</p> +<p> + Bestimmungsgemäße Nutzung / Sperrung bei missbräuchlicher Verwendung +</p> +<p> + Sie dürfen die App und die CWA-Dienste nur bestimmungsgemäß nutzen. Das RKI + behält sich vor, Sie bei missbräuchlicher Verwendung der App oder nicht + bestimmungsgemäßem Zugriff auf die CWA-Dienste von der Nutzung der App und + der CWA-Dienste auszuschließen. +</p> +<p> + Dienste Dritter +</p> +<p> + Sofern Sie im Zusammenhang mit der Nutzung der App Dienste Dritter in + Anspruch nehmen, insbesondere die Dienste von + Telekommunikationsdienstleistern für die Bereitstellung einer + Datenverbindung, sind Sie für damit im Zusammenhang stehenden Kosten und + die Einhaltung der jeweiligen Vertragsbedingungen selbst verantwortlich. +</p> +<p> + Anwendbares Recht +</p> +<p> + Diese Nutzungsbedingungen unterliegen dem Recht der Bundesrepublik + Deutschland. Das Ãœbereinkommen der Vereinten Nationen über Verträge über + den internationalen Warenkauf findet keine Anwendung. Die gesetzlichen + Vorschriften zur Beschränkung der Rechtswahl und zur Anwendbarkeit + zwingender Vorschriften insbesondere des Staates, in dem Sie als + Verbraucher Ihren gewöhnlichen Aufenthalt haben, bleiben unberührt. +</p> +<p> + Teilunwirksamkeit +</p> +<p> + Diese Nutzungsbedingungen bleiben auch bei rechtlicher Unwirksamkeit + einzelner Punkte in ihren übrigen Teilen verbindlich. Anstelle der + unwirksamen Punkte treten, soweit vorhanden, die gesetzlichen Vorschriften. + Soweit dies für eine Vertragspartei eine unzumutbare Härte darstellen + würde, werden die Nutzungsbedingungen jedoch im Ganzen unwirksam. +</p> \ No newline at end of file diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/CoronaWarnApplication.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/CoronaWarnApplication.kt index cae06737762d016942599388e9a4897574499037..4136487edde2c3abfc4579a54ea170d104635246 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/CoronaWarnApplication.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/CoronaWarnApplication.kt @@ -8,7 +8,6 @@ import android.content.IntentFilter import android.content.pm.ActivityInfo import android.os.Bundle import android.util.Log -import android.view.WindowManager import androidx.lifecycle.Lifecycle import androidx.lifecycle.LifecycleObserver import androidx.lifecycle.OnLifecycleEvent @@ -92,10 +91,12 @@ class CoronaWarnApplication : Application(), LifecycleObserver, @SuppressLint("SourceLockedOrientationActivity") override fun onActivityCreated(activity: Activity, savedInstanceState: Bundle?) { // prevents screenshot of the app for all activities + // TODO temporarily removed screenshot prevention for testing purposes + /* activity.window.setFlags( WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE - ) + )*/ // set screen orientation to portrait activity.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_USER_PORTRAIT } diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/exception/ApplicationConfigurationCorruptException.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/exception/ApplicationConfigurationCorruptException.kt index 2ee92246e50b891bb5bcb718b26dd9efed7b4a7f..5cb36f06630e270566e5d94289868c60dadcdec4 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/exception/ApplicationConfigurationCorruptException.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/exception/ApplicationConfigurationCorruptException.kt @@ -1,5 +1,8 @@ package de.rki.coronawarnapp.exception -class ApplicationConfigurationCorruptException : Exception( - "the application configuration is corrupt" +import de.rki.coronawarnapp.exception.reporting.ErrorCodes +import de.rki.coronawarnapp.exception.reporting.ReportedException + +class ApplicationConfigurationCorruptException : ReportedException( + ErrorCodes.APPLICATION_CONFIGURATION_CORRUPT.code, "the application configuration is corrupt" ) diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/exception/ApplicationConfigurationInvalidException.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/exception/ApplicationConfigurationInvalidException.kt index 73272e43de0d81664489da0e711c950ec320037f..eb71a47e24b1bbe53d1cc6c641bed6eb118127c8 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/exception/ApplicationConfigurationInvalidException.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/exception/ApplicationConfigurationInvalidException.kt @@ -1,5 +1,8 @@ package de.rki.coronawarnapp.exception -class ApplicationConfigurationInvalidException : Exception( - "the application configuration is invalid" +import de.rki.coronawarnapp.exception.reporting.ErrorCodes +import de.rki.coronawarnapp.exception.reporting.ReportedException + +class ApplicationConfigurationInvalidException : ReportedException( + ErrorCodes.APPLICATION_CONFIGURATION_INVALID.code, "the application configuration is invalid" ) diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/exception/CwaSecurityException.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/exception/CwaSecurityException.kt index aead0b56edbefe9fca468a1f99841a83c2e56bd1..95c6617ea83e09ff8b12bcee12d293a7b91037cc 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/exception/CwaSecurityException.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/exception/CwaSecurityException.kt @@ -1,6 +1,10 @@ package de.rki.coronawarnapp.exception -class CwaSecurityException(cause: Throwable) : Exception( +import de.rki.coronawarnapp.exception.reporting.ErrorCodes +import de.rki.coronawarnapp.exception.reporting.ReportedException + +class CwaSecurityException(cause: Throwable) : ReportedException( + ErrorCodes.CWA_SECURITY_PROBLEM.code, "something went wrong during a critical part of the application ensuring security, please refer" + "to the details for more information", cause diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/exception/CwaWebSecurityException.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/exception/CwaWebSecurityException.kt index 6dbbbca8d839009580fb20639f7807c8cf9457cc..67e9b217a3b46dd204be68c8c16f464558c086ed 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/exception/CwaWebSecurityException.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/exception/CwaWebSecurityException.kt @@ -1,8 +1,10 @@ package de.rki.coronawarnapp.exception -import okio.IOException +import de.rki.coronawarnapp.exception.reporting.ErrorCodes +import de.rki.coronawarnapp.exception.reporting.ReportedIOException -class CwaWebSecurityException(cause: Throwable) : IOException( +class CwaWebSecurityException(cause: Throwable) : ReportedIOException( + ErrorCodes.CWA_WEB_SECURITY_PROBLEM.code, "an error occurred while trying to establish a secure connection to the server", cause ) diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/exception/DiagnosisKeyServiceException.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/exception/DiagnosisKeyServiceException.kt index 2649446d99d0d42725d21f074a9df1193fc9e81a..2d0947b3fe5a6d5ac5f350586d4d7a5884c09a84 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/exception/DiagnosisKeyServiceException.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/exception/DiagnosisKeyServiceException.kt @@ -1,5 +1,8 @@ package de.rki.coronawarnapp.exception +import de.rki.coronawarnapp.exception.reporting.ErrorCodes +import de.rki.coronawarnapp.exception.reporting.ReportedException + /** * An Exception thrown when an error occurs inside the DiagnosisKeyService * @@ -10,4 +13,4 @@ package de.rki.coronawarnapp.exception * @see DiagnosisKeyRetrievalException */ abstract class DiagnosisKeyServiceException(message: String, cause: Throwable) : - Exception(message, cause) + ReportedException(ErrorCodes.DIAGNOSIS_KEY_SERVICE_PROBLEM.code, message, cause) diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/exception/ENPermissionException.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/exception/ENPermissionException.kt index 1c13d919eb34b7044d1bcdfadc91af7bfba6f4e0..86ed68b893e8d8a32e0394ec3e117e0f4e09f841 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/exception/ENPermissionException.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/exception/ENPermissionException.kt @@ -1,3 +1,10 @@ package de.rki.coronawarnapp.exception -class ENPermissionException : Exception("user did not grant the exposure notification permission") +import de.rki.coronawarnapp.exception.reporting.ErrorCodes +import de.rki.coronawarnapp.exception.reporting.ReportedException + +class ENPermissionException : + ReportedException( + ErrorCodes.EN_PERMISSION_PROBLEM.code, + "user did not grant the exposure notification permission" + ) diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/exception/FormatterException.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/exception/FormatterException.kt index d52d86888ef35b8a4ba1701d34667a64ef338828..3749458a7d6c36e8c6f894498b6ee8b0f7681af7 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/exception/FormatterException.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/exception/FormatterException.kt @@ -1,6 +1,13 @@ package de.rki.coronawarnapp.exception +import de.rki.coronawarnapp.exception.reporting.ErrorCodes +import de.rki.coronawarnapp.exception.reporting.ReportedException + class FormatterException(cause: Throwable?) : - Exception("exception occurred during formatting", cause) { + ReportedException( + ErrorCodes.FORMATTER_PROBLEM.code, + "exception occurred during formatting", + cause + ) { constructor() : this(null) } diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/exception/RiskLevelCalculationException.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/exception/RiskLevelCalculationException.kt index 6f6216f1cdebcad652c3dfc86f790ea276d603af..73167bf44408aa1bbc97fd2e7d7ed39de7f657b4 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/exception/RiskLevelCalculationException.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/exception/RiskLevelCalculationException.kt @@ -1,4 +1,10 @@ package de.rki.coronawarnapp.exception +import de.rki.coronawarnapp.exception.reporting.ErrorCodes +import de.rki.coronawarnapp.exception.reporting.ReportedException + class RiskLevelCalculationException(cause: Throwable) : - Exception("an exception occurred during risk level calculation", cause) + ReportedException( + ErrorCodes.RISK_LEVEL_CALCULATION_PROBLEM.code, + "an exception occurred during risk level calculation", cause + ) diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/exception/RollbackException.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/exception/RollbackException.kt index 3b3839f2ec5ec53b0719f571847fd59881c6ce79..0b9fa0e4f10a1ec0e1c47a51fd2c957a9c55ee89 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/exception/RollbackException.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/exception/RollbackException.kt @@ -1,5 +1,7 @@ package de.rki.coronawarnapp.exception +import de.rki.coronawarnapp.exception.reporting.ErrorCodes +import de.rki.coronawarnapp.exception.reporting.ReportedException import java.util.UUID /** @@ -12,7 +14,8 @@ import java.util.UUID * @see de.rki.coronawarnapp.transaction.Transaction */ class RollbackException(transactionId: UUID, state: String, cause: Throwable?) : - Exception( + ReportedException( + ErrorCodes.ROLLBACK_PROBLEM.code, "An error occurred during rollback of transaction $transactionId, State $state", IllegalStateException( "the state before the transaction state could not be restored.", diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/exception/TransactionException.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/exception/TransactionException.kt index a1005769284bf119bc27023521241d00f1a26692..c7dd5daca0247d3e705b6cc4bc0c468be1341f2c 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/exception/TransactionException.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/exception/TransactionException.kt @@ -1,5 +1,7 @@ package de.rki.coronawarnapp.exception +import de.rki.coronawarnapp.exception.reporting.ErrorCodes +import de.rki.coronawarnapp.exception.reporting.ReportedException import java.util.UUID /** @@ -12,7 +14,8 @@ import java.util.UUID * @see de.rki.coronawarnapp.transaction.Transaction */ class TransactionException constructor(transactionId: UUID, state: String, cause: Throwable?) : - Exception( + ReportedException( + ErrorCodes.TRANSACTION_PROBLEM.code, "An error occurred during execution of transaction $transactionId, State $state", cause ) diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/exception/WrongReceiverException.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/exception/WrongReceiverException.kt index e1a24c60bdd87f4e2f06279f2ca7fca02067ede4..53026910f5fd11aebb54afd20127fd57eca82865 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/exception/WrongReceiverException.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/exception/WrongReceiverException.kt @@ -1,5 +1,8 @@ package de.rki.coronawarnapp.exception +import de.rki.coronawarnapp.exception.reporting.ErrorCodes +import de.rki.coronawarnapp.exception.reporting.ReportedException + /** * An Exception thrown when an error occurs inside the Rollback of a Transaction. * @@ -13,7 +16,8 @@ class WrongReceiverException( action: String?, expected: String, cause: Throwable -) : Exception( +) : ReportedException( + ErrorCodes.WRONG_RECEIVER_PROBLEM.code, "An error occurred during BroadcastReceiver onReceive function. " + "Received action was $action, expected action was $expected", cause 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 edc00b401de006eec66ca9bbdad0f6a73af09c87..cdbae945643e8df4c020dda6c6670256b99307de 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/exception/http/CwaWebException.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/exception/http/CwaWebException.kt @@ -1,9 +1,10 @@ package de.rki.coronawarnapp.exception.http -import java.io.IOException +import de.rki.coronawarnapp.exception.reporting.ErrorCodes +import de.rki.coronawarnapp.exception.reporting.ReportedIOException -open class CwaWebException(statusCode: Int) : IOException( - "error during web request, http status $statusCode" +open class CwaWebException(statusCode: Int) : ReportedIOException( + ErrorCodes.CWA_WEB_REQUEST_PROBLEM.code, "error during web request, http status $statusCode" ) open class CwaServerError(val statusCode: Int) : CwaWebException(statusCode) { 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 new file mode 100644 index 0000000000000000000000000000000000000000..9eb6be271dca16f397e860bf41bd24b5cb7e2239 --- /dev/null +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/exception/reporting/ErrorCodes.kt @@ -0,0 +1,21 @@ +package de.rki.coronawarnapp.exception.reporting + +enum class ErrorCodes(val code: Int) { + // TECHNICAL + WRONG_RECEIVER_PROBLEM(100), + TRANSACTION_PROBLEM(500), + ROLLBACK_PROBLEM(510), + APPLICATION_CONFIGURATION_CORRUPT(1000), + APPLICATION_CONFIGURATION_INVALID(1001), + CWA_SECURITY_PROBLEM(2000), + CWA_WEB_SECURITY_PROBLEM(2001), + DIAGNOSIS_KEY_SERVICE_PROBLEM(3000), + RISK_LEVEL_CALCULATION_PROBLEM(3500), + CWA_WEB_REQUEST_PROBLEM(4000), + EN_PERMISSION_PROBLEM(7000), + FORMATTER_PROBLEM(8000), + REPORTED_EXCEPTION_PROBLEM(9001), + REPORTED_IO_EXCEPTION_PROBLEM(9101), + REPORTED_EXCEPTION_UNKNOWN_PROBLEM(9002) + // NONTECHNICAL +} 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 0213635c4cc251b1482ef0dc1fbbc37c8403c35c..42a0ad0e255aac2a014e0d38cb29b0923c86740e 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 @@ -9,6 +9,7 @@ import de.rki.coronawarnapp.CoronaWarnApplication import de.rki.coronawarnapp.R import de.rki.coronawarnapp.exception.ExceptionCategory import de.rki.coronawarnapp.util.DialogHelper +import java.util.Locale class ErrorReportReceiver(private val activity: Activity) : BroadcastReceiver() { companion object { @@ -27,12 +28,18 @@ class ErrorReportReceiver(private val activity: Activity) : BroadcastReceiver() val confirm = context.resources.getString(R.string.errors_generic_button_positive) val details = context.resources.getString(R.string.errors_generic_button_negative) val detailsTitle = context.resources.getString(R.string.errors_generic_details_headline) + val errorCode = intent.getIntExtra( + ReportingConstants.ERROR_REPORT_CODE_EXTRA, + ReportingConstants.ERROR_REPORT_UNKNOWN_ERROR + ) + val errorTitle = context.resources.getString(R.string.errors_generic_details_headline) + .toUpperCase(Locale.ROOT) if (CoronaWarnApplication.isAppInForeground) { DialogHelper.showDialog( DialogHelper.DialogInstance( activity, - title, + "$errorTitle: $errorCode\n$title", message, confirm, details, 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 feaa6711f16b789b72a31055e642cb199dd7637f..33202a7f1991caf16ce1021739b953b7359e8c8b 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 @@ -20,6 +20,11 @@ fun Throwable.report( intent.putExtra(ReportingConstants.ERROR_REPORT_PREFIX_EXTRA, prefix) intent.putExtra(ReportingConstants.ERROR_REPORT_SUFFIX_EXTRA, suffix) intent.putExtra(ReportingConstants.ERROR_REPORT_MESSAGE_EXTRA, this.message) + + if (this is ReportedExceptionInterface) { + intent.putExtra(ReportingConstants.ERROR_REPORT_CODE_EXTRA, this.code) + } + val sw = StringWriter() this.printStackTrace() this.printStackTrace(PrintWriter(sw)) diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/exception/reporting/ReportedException.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/exception/reporting/ReportedException.kt new file mode 100644 index 0000000000000000000000000000000000000000..64b3b0679eec630c344a2a21ad9b21480f78332a --- /dev/null +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/exception/reporting/ReportedException.kt @@ -0,0 +1,23 @@ +package de.rki.coronawarnapp.exception.reporting + +import java.io.IOException + +open class ReportedException( + override val code: Int? = ErrorCodes.REPORTED_EXCEPTION_PROBLEM.code, + message: String? = null, + cause: Throwable? = null +) : Exception( + message, cause +), ReportedExceptionInterface + +open class ReportedIOException( + override val code: Int? = ErrorCodes.REPORTED_IO_EXCEPTION_PROBLEM.code, + message: String? = null, + cause: Throwable? = null +) : IOException( + message, cause +), ReportedExceptionInterface + +interface ReportedExceptionInterface { + val code: Int? +} 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 d3eb21a2eb92dd17372701ec8bae9ddef8ec865c..50b90f314a35e57cad4bb9b5fa9a89b6939c45bd 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 @@ -7,4 +7,6 @@ object ReportingConstants { const val ERROR_REPORT_SUFFIX_EXTRA = "suffix" const val ERROR_REPORT_MESSAGE_EXTRA = "message" const val ERROR_REPORT_STACK_EXTRA = "stack" + const val ERROR_REPORT_CODE_EXTRA = "code" + val ERROR_REPORT_UNKNOWN_ERROR = ErrorCodes.REPORTED_EXCEPTION_UNKNOWN_PROBLEM.code } 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 6010d2f3303dfaf3ba613ebb78a2a6fc931eb68b..3ce3ac2efdf276050c9c9ae1d5413d7300382ec1 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 @@ -143,6 +143,23 @@ object LocalData { ) } + /** + * Sets the total amount of time the tracing was not active + * from the EncryptedSharedPrefs + * + * @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() + .getString(R.string.preference_total_non_active_tracing), + value ?: 0L + ) + } + } + /** * Gets the total amount of time the tracing was not active * from the EncryptedSharedPrefs @@ -158,22 +175,65 @@ object LocalData { } /** - * Sets the total amount of time the tracing was not active + + * Gets the timestamp when the Background Polling Began initially + * from the EncryptedSharedPrefs + * + * @return timestamp in ms + */ + fun initialPollingForTestResultTimeStamp(): Long { + return getSharedPreferenceInstance().getLong( + CoronaWarnApplication.getAppContext() + .getString(R.string.preference_polling_test_result_started), + 0L + ) + } + + /** + * Sets the timestamp when the Background Polling Began initially * from the EncryptedSharedPrefs * * @param value timestamp in ms */ - fun totalNonActiveTracing(value: Long?) { - // TODO need this for nullable ref, shout not be goto for nullable storage + fun initialPollingForTestResultTimeStamp(value: Long) = getSharedPreferenceInstance().edit(true) { putLong( CoronaWarnApplication.getAppContext() - .getString(R.string.preference_total_non_active_tracing), - value ?: 0L + .getString(R.string.preference_polling_test_result_started), + value ) } + + /** + + * Gets the flag if notification is executed on Status Change + * from the EncryptedSharedPrefs + * + * @return boolean + */ + fun isTestResultNotificationSent(): Boolean { + return getSharedPreferenceInstance().getBoolean( + CoronaWarnApplication.getAppContext() + .getString(R.string.preference_test_result_notification), + false + ) } + /** + * Sets the flag if notification is executed on Status Change + * from the EncryptedSharedPrefs + * + * @param value boolean + */ + fun isTestResultNotificationSent(value: Boolean) = + getSharedPreferenceInstance().edit(true) { + putBoolean( + CoronaWarnApplication.getAppContext() + .getString(R.string.preference_test_result_notification), + value + ) + } + /**************************************************** * RISK LEVEL ****************************************************/ diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/storage/SubmissionRepository.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/storage/SubmissionRepository.kt index f6ab3dad85f97a4aad5977020b87057c54410e80..424167ff581921dc6d702187f1dc75072e3e60f9 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/storage/SubmissionRepository.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/storage/SubmissionRepository.kt @@ -5,6 +5,7 @@ import de.rki.coronawarnapp.exception.NoRegistrationTokenSetException import de.rki.coronawarnapp.service.submission.SubmissionService import de.rki.coronawarnapp.util.DeviceUIState import de.rki.coronawarnapp.util.formatter.TestResult +import de.rki.coronawarnapp.worker.BackgroundWorkScheduler import java.util.Date object SubmissionRepository { @@ -45,6 +46,9 @@ object SubmissionRepository { val currentTime = System.currentTimeMillis() LocalData.inititalTestResultReceivedTimestamp(currentTime) testResultReceivedDate.value = Date(currentTime) + if (testResult == TestResult.PENDING) { + BackgroundWorkScheduler.startWorkScheduler() + } } else { testResultReceivedDate.value = Date(initialTestResultReceivedTimestamp) } 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 5b587643bf477daa024031ae57b7ed0714a248e4..9df2c027be923215af506865eced0456b570b57d 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 @@ -5,11 +5,9 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.view.accessibility.AccessibilityEvent -import de.rki.coronawarnapp.R import de.rki.coronawarnapp.databinding.FragmentInformationPrivacyBinding import de.rki.coronawarnapp.ui.BaseFragment import de.rki.coronawarnapp.ui.main.MainActivity -import de.rki.coronawarnapp.util.AssetConstants /** * Basic Fragment which only displays static content. @@ -39,7 +37,6 @@ class InformationPrivacyFragment : BaseFragment() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) setButtonOnClickListener() - loadWebView() } override fun onStart() { @@ -57,9 +54,4 @@ class InformationPrivacyFragment : BaseFragment() { (activity as MainActivity).goBack() } } - - private fun loadWebView() { - val informationPrivacyHtmlFilename = getString(R.string.information_privacy_html_path) - binding.informationPrivacyWebview.loadUrl(AssetConstants.ANDROID_ASSET_PATH + informationPrivacyHtmlFilename) - } } 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 7d68ca4ee1ed16269ca81ea642614a14730f3eb8..02bc5c35d50c93a9121fdcf7d1dacc848aeed4ca 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 @@ -5,11 +5,9 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.view.accessibility.AccessibilityEvent -import de.rki.coronawarnapp.R import de.rki.coronawarnapp.databinding.FragmentInformationTechnicalBinding import de.rki.coronawarnapp.ui.BaseFragment import de.rki.coronawarnapp.ui.main.MainActivity -import de.rki.coronawarnapp.util.AssetConstants /** * Basic Fragment which only displays static content. @@ -39,7 +37,6 @@ class InformationTechnicalFragment : BaseFragment() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) setButtonOnClickListener() - loadWebView() } override fun onStart() { @@ -57,9 +54,4 @@ class InformationTechnicalFragment : BaseFragment() { (activity as MainActivity).goBack() } } - - private fun loadWebView() { - val informationTermsHtmlFilename = getString(R.string.information_technical_html_path) - binding.informationTechnicalWebview.loadUrl(AssetConstants.ANDROID_ASSET_PATH + informationTermsHtmlFilename) - } } 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 86374777becb4dd941d9c048112aa3ae4d63ac21..0cfb04cd94a1318f5858e030457b902e46dafde3 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 @@ -5,11 +5,9 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.view.accessibility.AccessibilityEvent -import de.rki.coronawarnapp.R import de.rki.coronawarnapp.databinding.FragmentInformationTermsBinding import de.rki.coronawarnapp.ui.BaseFragment import de.rki.coronawarnapp.ui.main.MainActivity -import de.rki.coronawarnapp.util.AssetConstants /** * Basic Fragment which only displays static content. @@ -39,7 +37,6 @@ class InformationTermsFragment : BaseFragment() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) setButtonOnClickListener() - loadWebView() } override fun onStart() { @@ -57,9 +54,4 @@ class InformationTermsFragment : BaseFragment() { (activity as MainActivity).goBack() } } - - private fun loadWebView() { - val informationTermsHtmlFilename = getString(R.string.information_terms_html_path) - binding.informationTermsWebview.loadUrl(AssetConstants.ANDROID_ASSET_PATH + informationTermsHtmlFilename) - } } 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 cb6e600ab7fe9e2f164b3c5219a23a63a8849c83..d0b72544881319983952997c765c4ccdef9cfa9f 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 @@ -5,10 +5,8 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.view.accessibility.AccessibilityEvent -import de.rki.coronawarnapp.R import de.rki.coronawarnapp.databinding.FragmentOnboardingPrivacyBinding import de.rki.coronawarnapp.ui.BaseFragment -import de.rki.coronawarnapp.util.AssetConstants /** * This fragment informs the user regarding privacy. @@ -38,7 +36,6 @@ class OnboardingPrivacyFragment : BaseFragment() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) setButtonOnClickListener() - loadWebView() } override fun onStart() { @@ -61,9 +58,4 @@ class OnboardingPrivacyFragment : BaseFragment() { (activity as OnboardingActivity).goBack() } } - - private fun loadWebView() { - val informationPrivacyHtmlFilename = getString(R.string.information_privacy_html_path) - binding.onboardingPrivacyWebview.loadUrl(AssetConstants.ANDROID_ASSET_PATH + informationPrivacyHtmlFilename) - } } 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 8a2e5ae927e13dd66962e04d5128f5dfc1309426..92b216178624176f78384ba9cc58b4a2c62dcdc6 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 @@ -17,6 +17,7 @@ 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.SettingsNavigationHelper +import de.rki.coronawarnapp.worker.BackgroundWorkScheduler import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.withContext @@ -70,7 +71,10 @@ class SettingsResetFragment : BaseFragment() { try { val isTracingEnabled = InternalExposureNotificationClient.asyncIsEnabled() // only stop tracing if it is currently enabled - if (isTracingEnabled) InternalExposureNotificationClient.asyncStop() + if (isTracingEnabled) { + InternalExposureNotificationClient.asyncStop() + BackgroundWorkScheduler.stopWorkScheduler() + } } catch (apiException: ApiException) { apiException.report( ExceptionCategory.EXPOSURENOTIFICATION, TAG, null 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 5e7d07cd5978df90aab3d75438acef67a2f1068f..3c3b3612c8806682ae52d52656da9397fbcff601 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 @@ -58,7 +58,7 @@ class TracingViewModel : ViewModel() { try { RiskLevelTransaction.start() } catch (e: TransactionException) { - e.report(INTERNAL) + e.cause?.report(INTERNAL) } } } diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/TimeAndDateExtensions.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/TimeAndDateExtensions.kt index 6206d2a139526fc87a79dafe8353e4951c540b13..717435f2587c8950a872c782a602ee59163d2b47 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/TimeAndDateExtensions.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/TimeAndDateExtensions.kt @@ -51,4 +51,17 @@ object TimeAndDateExtensions { TimeUnit.MILLISECONDS.toMinutes(this) % TimeUnit.HOURS.toMinutes(1), TimeUnit.MILLISECONDS.toSeconds(this) % TimeUnit.MINUTES.toSeconds(1) ) + + /** + * Calculates the difference between two timestamps in Days Units + * + * @return Long + * + * @see TimeUnit + */ + fun calculateDays(firstDate: Long, secondDate: Long): Long { + val millionSeconds = secondDate - firstDate + var days = TimeUnit.MILLISECONDS.toDays(millionSeconds) + return days + } } 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 17fead213b827df2ac6150a36496676d76bf0938..6b1a56f39daa147d7c93f795fcaa0d08bdffa96e 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 @@ -3,8 +3,8 @@ package de.rki.coronawarnapp.util.formatter import android.graphics.drawable.Drawable +import android.text.Spanned import android.view.View -import androidx.annotation.StringRes import androidx.core.text.HtmlCompat import de.rki.coronawarnapp.CoronaWarnApplication import de.rki.coronawarnapp.R @@ -89,6 +89,14 @@ fun formatVisibilityInverted(value: Boolean): Int = formatVisibility(!value) */ fun formatVisibilityText(text: String?): Int = formatVisibility(text != null && text != "") +/** + * Formats visibility of item if valid spannable is provided + * + * @param text + * @return + */ +fun formatVisibilityText(text: CharSequence?): Int = formatVisibility(text != null) + /*Text*/ /** * Formats text resource to be displayed depending on flag provided @@ -118,10 +126,14 @@ fun formatColorIcon(color: Int?): Int { return color ?: appContext.getColor(R.color.colorAccentTintIcon) } -fun formatStringAsHTML(@StringRes stringRes: Int) = HtmlCompat.fromHtml( - CoronaWarnApplication.getAppContext().getString(stringRes), - HtmlCompat.FROM_HTML_MODE_LEGACY -) +fun formatStringAsHTMLFromLocal(path: String): Spanned { + val appContext = CoronaWarnApplication.getAppContext() + val content = appContext.assets.open(path).bufferedReader().use { it.readText() } + return HtmlCompat.fromHtml( + content, + HtmlCompat.FROM_HTML_MODE_LEGACY + ) +} /** * TODO diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/formatter/FormatterRiskHelper.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/formatter/FormatterRiskHelper.kt index 8814199e1f15a941f5163ecd2144df0c41a128ac..b31ab699bd0e0ae73f1b2c77a915344f4f104486 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/formatter/FormatterRiskHelper.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/formatter/FormatterRiskHelper.kt @@ -523,7 +523,7 @@ fun formatBehaviorIcon(riskLevelScore: Int?): Int { val appContext = CoronaWarnApplication.getAppContext() return when (riskLevelScore) { RiskLevelConstants.NO_CALCULATION_POSSIBLE_TRACING_OFF, - RiskLevelConstants.UNKNOWN_RISK_OUTDATED_RESULTS -> appContext.getColor(R.color.colorAccentTintIcon) + RiskLevelConstants.UNKNOWN_RISK_OUTDATED_RESULTS -> appContext.getColor(R.color.colorSemanticNeutralRisk) else -> appContext.getColor(R.color.colorStableLight) } } diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/worker/BackgroundConstants.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/worker/BackgroundConstants.kt index a36174aeac4bc1859222d0ef21d03b368550d8c5..30ad926c412aed40bc31db4e29927bd5f7c7d17e 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/worker/BackgroundConstants.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/worker/BackgroundConstants.kt @@ -19,6 +19,11 @@ object BackgroundConstants { */ const val DIAGNOSIS_KEY_PERIODIC_WORKER_TAG = "DIAGNOSIS_KEY_PERIODIC_WORKER" + /** + * Tag for background polling tp check test result periodic work + */ + const val DIAGNOSIS_TEST_RESULT_PERIODIC_WORKER_TAG = "DIAGNOSIS_TEST_RESULT_PERIODIC_WORKER" + /** * Unique name for diagnosis key retrieval one time work */ @@ -29,6 +34,11 @@ object BackgroundConstants { */ const val DIAGNOSIS_KEY_PERIODIC_WORK_NAME = "DiagnosisKeyBackgroundPeriodicWork" + /** + * Unique name for diagnosis test result retrieval periodic work + */ + const val DIAGNOSIS_TEST_RESULT_PERIODIC_WORK_NAME = "DiagnosisTestResultBackgroundPeriodicWork" + /** * Total minutes in one day */ @@ -46,12 +56,25 @@ object BackgroundConstants { */ const val GOOGLE_API_MAX_CALLS_PER_DAY = 20 + /** + * Total tries count for diagnosis key retrieval per day + * Internal requirement + */ + const val DIAGNOSIS_TEST_RESULT_RETRIEVAL_TRIES_PER_DAY = 12 + /** * Kind initial delay in minutes for periodic work for accessibility reason * * @see TimeUnit.MINUTES */ - const val DIAGNOSIS_KEY_PERIODIC_KIND_DELAY = 1L + const val KIND_DELAY = 1L + + /** + * Kind initial delay in minutes for periodic work for accessibility reason + * + * @see TimeUnit.SECONDS + */ + const val DIAGNOSIS_TEST_RESULT_PERIODIC_INITIAL_DELAY = 10L /** * Minimum initial delay in minutes for diagnosis key retrieval one time work @@ -89,4 +112,11 @@ object BackgroundConstants { * Retries before work would set as FAILED */ const val WORKER_RETRY_COUNT_THRESHOLD = 3 + + /** + * The maximum validity in days for keeping Background polling active + * + * @see TimeUnit.DAYS + */ + const val POLLING_VALIDITY_MAX_DAYS = 21 } diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/worker/BackgroundWorkHelper.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/worker/BackgroundWorkHelper.kt new file mode 100644 index 0000000000000000000000000000000000000000..b981162c45bf3a0b1d3c4a09fa6c217e07af4ffb --- /dev/null +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/worker/BackgroundWorkHelper.kt @@ -0,0 +1,73 @@ +package de.rki.coronawarnapp.worker + +import androidx.work.Constraints +import androidx.work.NetworkType + +/** + * Singleton class for background work helper functions + * The helper uses externalised constants for readability. + * + * @see BackgroundConstants + * @see BackgroundWorkScheduler + */ +object BackgroundWorkHelper { + + /** + * Calculate the time for diagnosis key retrieval periodic work + * + * @return Long + * + * @see BackgroundConstants.MINUTES_IN_DAY + * @see getDiagnosisKeyRetrievalMaximumCalls + */ + fun getDiagnosisKeyRetrievalPeriodicWorkTimeInterval(): Long = + (BackgroundConstants.MINUTES_IN_DAY / getDiagnosisKeyRetrievalMaximumCalls()).toLong() + + /** + * Calculate the time for diagnosis key retrieval periodic work + * + * @return Long + * + * @see BackgroundConstants.MINUTES_IN_DAY + */ + fun getDiagnosisTestResultRetrievalPeriodicWorkTimeInterval(): Long = + (BackgroundConstants.MINUTES_IN_DAY / + BackgroundConstants.DIAGNOSIS_TEST_RESULT_RETRIEVAL_TRIES_PER_DAY).toLong() + + /** + * Get maximum calls count to Google API + * + * @return Long + * + * @see BackgroundConstants.DIAGNOSIS_KEY_RETRIEVAL_TRIES_PER_DAY + * @see BackgroundConstants.GOOGLE_API_MAX_CALLS_PER_DAY + */ + fun getDiagnosisKeyRetrievalMaximumCalls() = + BackgroundConstants.DIAGNOSIS_KEY_RETRIEVAL_TRIES_PER_DAY + .coerceAtMost(BackgroundConstants.GOOGLE_API_MAX_CALLS_PER_DAY) + + /** + * Constraints for diagnosis key periodic work + * Do not execute background work if battery on low level. + * + * @return Constraints + */ + fun getConstraintsForDiagnosisKeyPeriodicBackgroundWork() = + Constraints.Builder().setRequiresBatteryNotLow(true).build() + + /** + * Constraints for diagnosis key one time work + * Requires battery not low and any network connection + * Mobile data usage is handled on OS level in application settings + * + * @return Constraints + * + * @see NetworkType.CONNECTED + */ + fun getConstraintsForDiagnosisKeyOneTimeBackgroundWork() = + Constraints + .Builder() + .setRequiresBatteryNotLow(true) + .setRequiredNetworkType(NetworkType.CONNECTED) + .build() +} diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/worker/BackgroundWorkScheduler.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/worker/BackgroundWorkScheduler.kt index c4e946d982ce78986df0135c77e62fa5ad8d0f47..bb7bf742c5600350bcf0f29ae0aa5a878db8fe93 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/worker/BackgroundWorkScheduler.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/worker/BackgroundWorkScheduler.kt @@ -2,10 +2,8 @@ package de.rki.coronawarnapp.worker import android.util.Log import androidx.work.BackoffPolicy -import androidx.work.Constraints import androidx.work.ExistingPeriodicWorkPolicy import androidx.work.ExistingWorkPolicy -import androidx.work.NetworkType import androidx.work.OneTimeWorkRequestBuilder import androidx.work.Operation import androidx.work.PeriodicWorkRequestBuilder @@ -13,6 +11,7 @@ import androidx.work.WorkInfo import androidx.work.WorkManager import de.rki.coronawarnapp.BuildConfig import de.rki.coronawarnapp.CoronaWarnApplication +import de.rki.coronawarnapp.storage.LocalData import org.joda.time.DateTime import org.joda.time.DateTimeZone import org.joda.time.Instant @@ -21,9 +20,10 @@ import java.util.concurrent.TimeUnit /** * Singleton class for background work handling - * The helper uses externalised constants for readability. + * The helper uses externalised constants and helper for readability. * * @see BackgroundConstants + * @see BackgroundWorkHelper */ object BackgroundWorkScheduler { @@ -36,10 +36,12 @@ object BackgroundWorkScheduler { * * @see BackgroundConstants.DIAGNOSIS_KEY_ONE_TIME_WORKER_TAG * @see BackgroundConstants.DIAGNOSIS_KEY_PERIODIC_WORKER_TAG + * @see BackgroundConstants.DIAGNOSIS_TEST_RESULT_PERIODIC_WORKER_TAG */ enum class WorkTag(val tag: String) { DIAGNOSIS_KEY_RETRIEVAL_ONE_TIME_WORKER(BackgroundConstants.DIAGNOSIS_KEY_ONE_TIME_WORKER_TAG), - DIAGNOSIS_KEY_RETRIEVAL_PERIODIC_WORKER(BackgroundConstants.DIAGNOSIS_KEY_PERIODIC_WORKER_TAG) + DIAGNOSIS_KEY_RETRIEVAL_PERIODIC_WORKER(BackgroundConstants.DIAGNOSIS_KEY_PERIODIC_WORKER_TAG), + DIAGNOSIS_TEST_RESULT_RETRIEVAL_PERIODIC_WORKER(BackgroundConstants.DIAGNOSIS_TEST_RESULT_PERIODIC_WORKER_TAG) } /** @@ -49,35 +51,14 @@ object BackgroundWorkScheduler { * * @see BackgroundConstants.DIAGNOSIS_KEY_ONE_TIME_WORK_NAME * @see BackgroundConstants.DIAGNOSIS_KEY_PERIODIC_WORK_NAME + * @see BackgroundConstants.DIAGNOSIS_TEST_RESULT_PERIODIC_WORK_NAME */ enum class WorkType(val uniqueName: String) { DIAGNOSIS_KEY_BACKGROUND_ONE_TIME_WORK(BackgroundConstants.DIAGNOSIS_KEY_ONE_TIME_WORK_NAME), - DIAGNOSIS_KEY_BACKGROUND_PERIODIC_WORK(BackgroundConstants.DIAGNOSIS_KEY_PERIODIC_WORK_NAME) + DIAGNOSIS_KEY_BACKGROUND_PERIODIC_WORK(BackgroundConstants.DIAGNOSIS_KEY_PERIODIC_WORK_NAME), + DIAGNOSIS_TEST_RESULT_PERIODIC_WORKER(BackgroundConstants.DIAGNOSIS_TEST_RESULT_PERIODIC_WORK_NAME) } - /** - * Calculate the time for diagnosis key retrieval periodic work - * - * @return Long - * - * @see BackgroundConstants.MINUTES_IN_DAY - * @see getDiagnosisKeyRetrievalMaximumCalls - */ - private fun getDiagnosisKeyRetrievalPeriodicWorkTimeInterval(): Long = - (BackgroundConstants.MINUTES_IN_DAY / getDiagnosisKeyRetrievalMaximumCalls()).toLong() - - /** - * Get maximum calls count to Google API - * - * @return Long - * - * @see BackgroundConstants.DIAGNOSIS_KEY_RETRIEVAL_TRIES_PER_DAY - * @see BackgroundConstants.GOOGLE_API_MAX_CALLS_PER_DAY - */ - private fun getDiagnosisKeyRetrievalMaximumCalls() = - BackgroundConstants.DIAGNOSIS_KEY_RETRIEVAL_TRIES_PER_DAY - .coerceAtMost(BackgroundConstants.GOOGLE_API_MAX_CALLS_PER_DAY) - /** * Work manager instance */ @@ -86,7 +67,9 @@ object BackgroundWorkScheduler { /** * Start work scheduler * Checks if periodic worker was already scheduled. If not - reschedule it again. + * For [WorkTag.DIAGNOSIS_TEST_RESULT_RETRIEVAL_PERIODIC_WORKER] also checks if User is Registered * + * @see LocalData.registrationToken * @see isWorkActive */ fun startWorkScheduler() { @@ -95,9 +78,27 @@ object BackgroundWorkScheduler { WorkTag.DIAGNOSIS_KEY_RETRIEVAL_PERIODIC_WORKER.tag, isPeriodicWorkActive ) - if (!isPeriodicWorkActive) WorkType.DIAGNOSIS_KEY_BACKGROUND_PERIODIC_WORK.start() + if (!isPeriodicWorkActive) { + WorkType.DIAGNOSIS_KEY_BACKGROUND_PERIODIC_WORK.start() + } + if (!isWorkActive(WorkTag.DIAGNOSIS_TEST_RESULT_RETRIEVAL_PERIODIC_WORKER.tag) && + LocalData.registrationToken() != null && !LocalData.isTestResultNotificationSent() + ) { + WorkType.DIAGNOSIS_TEST_RESULT_PERIODIC_WORKER.start() + LocalData.initialPollingForTestResultTimeStamp(System.currentTimeMillis()) + } } + /** + * Stop work by unique name + * + * @return Operation + * + * @see WorkType + */ + fun WorkType.stop(): Operation = + workManager.cancelUniqueWork(this.uniqueName) + /** * Checks if defined work is active * Non-active means worker was Cancelled, Failed or have not been enqueued at all @@ -167,6 +168,7 @@ object BackgroundWorkScheduler { private fun WorkType.start(): Operation = when (this) { WorkType.DIAGNOSIS_KEY_BACKGROUND_PERIODIC_WORK -> enqueueDiagnosisKeyBackgroundPeriodicWork() WorkType.DIAGNOSIS_KEY_BACKGROUND_ONE_TIME_WORK -> enqueueDiagnosisKeyBackgroundOneTimeWork() + WorkType.DIAGNOSIS_TEST_RESULT_PERIODIC_WORKER -> enqueueDiagnosisTestResultBackgroundPeriodicWork() } /** @@ -197,6 +199,22 @@ object BackgroundWorkScheduler { buildDiagnosisKeyRetrievalOneTimeWork() ).also { it.logOperationSchedule(WorkType.DIAGNOSIS_KEY_BACKGROUND_ONE_TIME_WORK) } + /** + * Enqueue diagnosis Test Result periodic + * Show a Notification when new Test Results are in. + * Replace with new if older work exists. + * + * @return Operation + * + * @see WorkType.DIAGNOSIS_TEST_RESULT_PERIODIC_WORKER + */ + private fun enqueueDiagnosisTestResultBackgroundPeriodicWork() = + workManager.enqueueUniquePeriodicWork( + WorkType.DIAGNOSIS_TEST_RESULT_PERIODIC_WORKER.uniqueName, + ExistingPeriodicWorkPolicy.REPLACE, + buildDiagnosisTestResultRetrievalPeriodicWork() + ).also { it.logOperationSchedule(WorkType.DIAGNOSIS_TEST_RESULT_PERIODIC_WORKER) } + /** * Build diagnosis key periodic work request * Set "kind delay" for accessibility reason. @@ -205,22 +223,22 @@ object BackgroundWorkScheduler { * @return PeriodicWorkRequest * * @see WorkTag.DIAGNOSIS_KEY_RETRIEVAL_PERIODIC_WORKER - * @see BackgroundConstants.DIAGNOSIS_KEY_PERIODIC_KIND_DELAY + * @see BackgroundConstants.KIND_DELAY * @see BackoffPolicy.LINEAR */ private fun buildDiagnosisKeyRetrievalPeriodicWork() = PeriodicWorkRequestBuilder<DiagnosisKeyRetrievalPeriodicWorker>( - getDiagnosisKeyRetrievalPeriodicWorkTimeInterval(), TimeUnit.MINUTES + BackgroundWorkHelper.getDiagnosisKeyRetrievalPeriodicWorkTimeInterval(), TimeUnit.MINUTES ) .addTag(WorkTag.DIAGNOSIS_KEY_RETRIEVAL_PERIODIC_WORKER.tag) - .setConstraints(getConstraintsForDiagnosisKeyPeriodicBackgroundWork()) + .setConstraints(BackgroundWorkHelper.getConstraintsForDiagnosisKeyPeriodicBackgroundWork()) .setInitialDelay( - BackgroundConstants.DIAGNOSIS_KEY_PERIODIC_KIND_DELAY, + BackgroundConstants.KIND_DELAY, TimeUnit.MINUTES ) .setBackoffCriteria( BackoffPolicy.LINEAR, - BackgroundConstants.DIAGNOSIS_KEY_PERIODIC_KIND_DELAY, + BackgroundConstants.KIND_DELAY, TimeUnit.MINUTES ) .build() @@ -234,13 +252,13 @@ object BackgroundWorkScheduler { * * @see WorkTag.DIAGNOSIS_KEY_RETRIEVAL_ONE_TIME_WORKER * @see buildDiagnosisKeyRetrievalOneTimeWork - * @see BackgroundConstants.DIAGNOSIS_KEY_PERIODIC_KIND_DELAY + * @see BackgroundConstants.KIND_DELAY * @see BackoffPolicy.LINEAR */ private fun buildDiagnosisKeyRetrievalOneTimeWork() = OneTimeWorkRequestBuilder<DiagnosisKeyRetrievalOneTimeWorker>() .addTag(WorkTag.DIAGNOSIS_KEY_RETRIEVAL_ONE_TIME_WORKER.tag) - .setConstraints(getConstraintsForDiagnosisKeyOneTimeBackgroundWork()) + .setConstraints(BackgroundWorkHelper.getConstraintsForDiagnosisKeyOneTimeBackgroundWork()) .setInitialDelay( DiagnosisKeyRetrievalTimeCalculator.generateDiagnosisKeyRetrievalOneTimeWorkRandomDuration( DateTime( @@ -251,50 +269,59 @@ object BackgroundWorkScheduler { ) .setBackoffCriteria( BackoffPolicy.LINEAR, - BackgroundConstants.DIAGNOSIS_KEY_PERIODIC_KIND_DELAY, + BackgroundConstants.KIND_DELAY, TimeUnit.MINUTES ) .build() /** - * Constraints for diagnosis key periodic work - * Do not execute background work if battery on low level. - * - * @return Constraints - */ - private fun getConstraintsForDiagnosisKeyPeriodicBackgroundWork() = - Constraints.Builder().setRequiresBatteryNotLow(true).build() - - /** - * Constraints for diagnosis key one time work - * Requires battery not low and any network connection - * Mobile data usage is handled on OS level in application settings + * Build diagnosis Test Result periodic work request + * Set "kind delay" for accessibility reason. * - * @return Constraints + * @return PeriodicWorkRequest * - * @see NetworkType.CONNECTED + * @see WorkTag.DIAGNOSIS_TEST_RESULT_RETRIEVAL_PERIODIC_WORKER + * @see BackgroundConstants.KIND_DELAY */ - private fun getConstraintsForDiagnosisKeyOneTimeBackgroundWork() = - Constraints - .Builder() - .setRequiresBatteryNotLow(true) - .setRequiredNetworkType(NetworkType.CONNECTED) + private fun buildDiagnosisTestResultRetrievalPeriodicWork() = + PeriodicWorkRequestBuilder<DiagnosisTestResultRetrievalPeriodicWorker>( + BackgroundWorkHelper.getDiagnosisTestResultRetrievalPeriodicWorkTimeInterval(), TimeUnit.MINUTES + ) + .addTag(WorkTag.DIAGNOSIS_TEST_RESULT_RETRIEVAL_PERIODIC_WORKER.tag) + .setConstraints(BackgroundWorkHelper.getConstraintsForDiagnosisKeyOneTimeBackgroundWork()) + .setInitialDelay( + BackgroundConstants.DIAGNOSIS_TEST_RESULT_PERIODIC_INITIAL_DELAY, + TimeUnit.SECONDS + ).setBackoffCriteria( + BackoffPolicy.LINEAR, + BackgroundConstants.KIND_DELAY, + TimeUnit.MINUTES + ) .build() /** * Log operation schedule */ - private fun Operation.logOperationSchedule(workType: WorkType) = this.result.addListener({ - if (BuildConfig.DEBUG) Log.d(TAG, "${workType.uniqueName} completed.") - }, { it.run() }).also { if (BuildConfig.DEBUG) Log.d(TAG, "${workType.uniqueName} scheduled.") } + private fun Operation.logOperationSchedule(workType: WorkType) = + this.result.addListener({ + if (BuildConfig.DEBUG) Log.d( + TAG, + "${workType.uniqueName} completed." + ) + }, { it.run() }) + .also { if (BuildConfig.DEBUG) Log.d(TAG, "${workType.uniqueName} scheduled.") } /** * Log operation cancellation */ - private fun Operation.logOperationCancelByTag(workTag: WorkTag) = this.result.addListener({ - if (BuildConfig.DEBUG) Log.d(TAG, "All work with tag ${workTag.tag} canceled.") - }, { it.run() }) - .also { if (BuildConfig.DEBUG) Log.d(TAG, "Canceling all work with tag ${workTag.tag}") } + private fun Operation.logOperationCancelByTag(workTag: WorkTag) = + this.result.addListener({ + if (BuildConfig.DEBUG) Log.d( + TAG, + "All work with tag ${workTag.tag} canceled." + ) + }, { it.run() }) + .also { if (BuildConfig.DEBUG) Log.d(TAG, "Canceling all work with tag ${workTag.tag}") } /** * Log work active status diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/worker/DiagnosisTestResultRetrievalPeriodicWorker.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/worker/DiagnosisTestResultRetrievalPeriodicWorker.kt new file mode 100644 index 0000000000000000000000000000000000000000..e1b40d62d61a12a1ec14fc93b308622f2adb4a5b --- /dev/null +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/worker/DiagnosisTestResultRetrievalPeriodicWorker.kt @@ -0,0 +1,116 @@ +package de.rki.coronawarnapp.worker + +import android.content.Context +import android.util.Log +import androidx.core.app.NotificationCompat +import androidx.work.CoroutineWorker +import androidx.work.WorkerParameters +import de.rki.coronawarnapp.BuildConfig +import de.rki.coronawarnapp.CoronaWarnApplication +import de.rki.coronawarnapp.R +import de.rki.coronawarnapp.notification.NotificationHelper +import de.rki.coronawarnapp.service.submission.SubmissionService +import de.rki.coronawarnapp.storage.LocalData +import de.rki.coronawarnapp.util.TimeAndDateExtensions +import de.rki.coronawarnapp.util.formatter.TestResult +import de.rki.coronawarnapp.worker.BackgroundWorkScheduler.stop + +/** + * Diagnosis Test Result Periodic retrieavl + * + * @see BackgroundWorkScheduler + */ +class DiagnosisTestResultRetrievalPeriodicWorker( + val context: Context, + workerParams: WorkerParameters +) : + CoroutineWorker(context, workerParams) { + + companion object { + private val TAG: String? = DiagnosisTestResultRetrievalPeriodicWorker::class.simpleName + } + + /** + * Work execution + * + * If background job is running for less than 21 days, testResult is checked. + * If the job is running for more than 21 days, the job will be stopped + * + * @return Result + * + * @see LocalData.isTestResultNotificationSent + * @see LocalData.initialPollingForTestResultTimeStamp + */ + override suspend fun doWork(): Result { + + if (BuildConfig.DEBUG) Log.d( + TAG, + "Background job started. Run attempt: $runAttemptCount" + ) + + if (runAttemptCount > BackgroundConstants.WORKER_RETRY_COUNT_THRESHOLD) { + if (BuildConfig.DEBUG) Log.d( + TAG, + "Background job failed after $runAttemptCount attempts. Rescheduling" + ) + BackgroundWorkScheduler.scheduleDiagnosisKeyPeriodicWork() + return Result.failure() + } + var result = Result.success() + try { + if (TimeAndDateExtensions.calculateDays( + LocalData.initialPollingForTestResultTimeStamp(), + System.currentTimeMillis() + ) < BackgroundConstants.POLLING_VALIDITY_MAX_DAYS + ) { + val testResult = SubmissionService.asyncRequestTestResult() + initiateNotification(testResult) + } else { + stopWorker() + } + } catch (e: Exception) { + result = Result.retry() + } + return result + } + + /** + * Notification Initiation + * + * If the returned Test Result is Negative, Positive or Invalid + * The Background polling will be stopped + * and a notification is shown, but only if the App is not in foreground + * + * @see LocalData.isTestResultNotificationSent + * @see LocalData.initialPollingForTestResultTimeStamp + * @see TestResult + */ + private fun initiateNotification(testResult: TestResult) { + if (testResult == TestResult.NEGATIVE || testResult == TestResult.POSITIVE || + testResult == TestResult.INVALID + ) { + if (!CoronaWarnApplication.isAppInForeground) { + NotificationHelper.sendNotification( + CoronaWarnApplication.getAppContext() + .getString(R.string.notification_name), CoronaWarnApplication.getAppContext() + .getString(R.string.notification_body), + NotificationCompat.PRIORITY_HIGH + ) + } + LocalData.isTestResultNotificationSent(true) + stopWorker() + } + } + + /** + * Stops the Background Polling worker + * + * @see LocalData.initialPollingForTestResultTimeStamp + * @see BackgroundWorkScheduler.stop + + */ + private fun stopWorker() { + LocalData.initialPollingForTestResultTimeStamp(0L) + BackgroundWorkScheduler.WorkType.DIAGNOSIS_TEST_RESULT_PERIODIC_WORKER.stop() + } +} 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 cd92970ac0fae850aaa3f367204f3c75c9eb82a6..d07c91a08f0d0ef5969d087e1f16fc1630663279 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 @@ -50,7 +50,7 @@ style="@style/subtitle" android:layout_width="0dp" android:layout_height="wrap_content" - android:layout_marginTop="@dimen/spacing_small" + android:layout_marginTop="@dimen/spacing_medium" android:text="@string/information_about_body_emphasized" app:layout_constraintEnd_toStartOf="@+id/guideline_end" app:layout_constraintStart_toEndOf="@+id/guideline_start" 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 20bede8c3ad3b6e86e215b2f35ba722acd8344e7..8d8dafb4e0f4603c471b7ed5dd5f23a206fe6388 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 @@ -51,7 +51,7 @@ layout="@layout/include_divider" android:layout_width="0dp" android:layout_height="wrap_content" - android:layout_marginTop="@dimen/spacing_normal" + android:layout_marginTop="@dimen/spacing_medium" app:layout_constraintEnd_toEndOf="@+id/guideline_end" app:layout_constraintStart_toStartOf="@id/guideline_start" app:layout_constraintTop_toBottomOf="@+id/information_contact_header_details" /> 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 f21af729c0b02ff4afbbf5bc2ac808e2888d38f4..05da54a758869f08b5e0d95a6758993d2b46f858 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 @@ -38,7 +38,7 @@ <androidx.constraintlayout.widget.ConstraintLayout android:layout_width="match_parent" - android:layout_height="match_parent"> + android:layout_height="wrap_content"> <include android:id="@+id/information_privacy_header_details" @@ -47,19 +47,11 @@ android:layout_height="wrap_content" app:illustration="@{@drawable/ic_illustration_privacy}" app:illustrationDescription="@{@string/information_privacy_illustration_description}" + app:body="@{FormatterHelper.formatStringAsHTMLFromLocal(@string/information_privacy_html_path)}" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> - <WebView - android:id="@+id/information_privacy_webview" - android:layout_width="@dimen/match_constraint" - android:layout_height="wrap_content" - android:layout_marginBottom="@dimen/spacing_normal" - app:layout_constraintEnd_toStartOf="@+id/guideline_end" - app:layout_constraintStart_toEndOf="@+id/guideline_start" - app:layout_constraintTop_toBottomOf="@+id/information_privacy_header_details" /> - <include layout="@layout/merge_guidelines_side" /> </androidx.constraintlayout.widget.ConstraintLayout> 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 9c89947a5677262cebbbd22154c429b9d3307af4..d9491981764baa72bbd6e03a77f6b5d4ead60d00 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 @@ -46,21 +46,13 @@ layout="@layout/include_information_details" android:layout_width="0dp" android:layout_height="wrap_content" + app:body="@{FormatterHelper.formatStringAsHTMLFromLocal(@string/information_technical_html_path)}" app:illustration="@{@drawable/ic_information_illustration_technical}" app:illustrationDescription="@{@string/information_technical_illustration_description}" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> - <WebView - android:id="@+id/information_technical_webview" - android:layout_width="@dimen/match_constraint" - android:layout_height="wrap_content" - android:layout_marginBottom="@dimen/spacing_normal" - app:layout_constraintEnd_toStartOf="@+id/guideline_end" - app:layout_constraintStart_toEndOf="@+id/guideline_start" - app:layout_constraintTop_toBottomOf="@+id/information_technical_header_details" /> - <include layout="@layout/merge_guidelines_side" /> </androidx.constraintlayout.widget.ConstraintLayout> 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 afd1ebdf854534a197a6d0c52fd59c840b3421e4..e4e13e84fb16ad1fb2f5dc72d07c3ebc971c3c82 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 @@ -45,6 +45,7 @@ layout="@layout/include_information_details" android:layout_width="0dp" android:layout_height="wrap_content" + app:body="@{FormatterHelper.formatStringAsHTMLFromLocal(@string/information_terms_html_path)}" app:headline="@{@string/information_terms_headline}" app:illustration="@{@drawable/ic_information_illustration_terms}" app:illustrationDescription="@{@string/information_terms_illustration_description}" @@ -52,16 +53,6 @@ app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> - <WebView - android:id="@+id/information_terms_webview" - android:layout_width="@dimen/match_constraint" - android:layout_height="wrap_content" - android:layout_marginTop="@dimen/spacing_small" - android:layout_marginBottom="@dimen/spacing_normal" - app:layout_constraintEnd_toStartOf="@+id/guideline_end" - app:layout_constraintStart_toEndOf="@+id/guideline_start" - app:layout_constraintTop_toBottomOf="@+id/information_terms_header_details" /> - <androidx.constraintlayout.widget.Guideline android:id="@+id/guideline_start" android:layout_width="wrap_content" 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 a47e4b2d88b67e375d6891be94b507bf53b3eeb1..f402de1c7dc1e1b86abd87b7c15e6b3b4c7fd802 100644 --- a/Corona-Warn-App/src/main/res/layout/fragment_main.xml +++ b/Corona-Warn-App/src/main/res/layout/fragment_main.xml @@ -131,8 +131,8 @@ android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_normal" android:visibility="@{FormatterSubmissionHelper.formatShowRiskStatusCard(submissionViewModel.deviceUiState)}" - app:layout_constraintEnd_toStartOf="@+id/guideline_end" - app:layout_constraintStart_toStartOf="@+id/guideline_start" + app:layout_constraintEnd_toStartOf="@+id/guideline_card_end" + app:layout_constraintStart_toStartOf="@+id/guideline_card_start" app:layout_constraintTop_toBottomOf="@+id/main_tracing_divider" app:settingsViewModel="@{settingsViewModel}" app:showDetails="@{false}" @@ -146,8 +146,8 @@ android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_normal" android:visibility="@{FormatterSubmissionHelper.formatSubmissionStatusCardUnregisteredVisible(submissionViewModel.deviceRegistered)}" - app:layout_constraintEnd_toStartOf="@+id/guideline_end" - app:layout_constraintStart_toStartOf="@+id/guideline_start" + app:layout_constraintEnd_toStartOf="@+id/guideline_card_end" + app:layout_constraintStart_toStartOf="@+id/guideline_card_start" app:layout_constraintTop_toBottomOf="@id/main_risk" /> <include @@ -158,8 +158,8 @@ android:layout_marginTop="@dimen/spacing_normal" android:visibility="@{FormatterSubmissionHelper.formatSubmissionStatusCardContentVisible(submissionViewModel.deviceUiState)}" app:deviceUIState="@{submissionViewModel.deviceUiState}" - app:layout_constraintEnd_toStartOf="@+id/guideline_end" - app:layout_constraintStart_toStartOf="@+id/guideline_start" + app:layout_constraintEnd_toStartOf="@+id/guideline_card_end" + app:layout_constraintStart_toStartOf="@+id/guideline_card_start" app:layout_constraintTop_toBottomOf="@id/main_test_unregistered" /> <include @@ -169,8 +169,8 @@ android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_normal" android:visibility="@{FormatterSubmissionHelper.formatSubmissionStatusCardFetchingVisible(submissionViewModel.deviceRegistered, submissionViewModel.uiStateState)}" - app:layout_constraintEnd_toStartOf="@+id/guideline_end" - app:layout_constraintStart_toStartOf="@+id/guideline_start" + app:layout_constraintEnd_toStartOf="@+id/guideline_card_end" + app:layout_constraintStart_toStartOf="@+id/guideline_card_start" app:layout_constraintTop_toBottomOf="@id/main_test_result" /> <include @@ -180,8 +180,8 @@ android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_normal" android:visibility="@{FormatterSubmissionHelper.formatShowSubmissionStatusPositiveCard(submissionViewModel.deviceUiState)}" - app:layout_constraintEnd_toStartOf="@+id/guideline_end" - app:layout_constraintStart_toStartOf="@+id/guideline_start" + app:layout_constraintEnd_toStartOf="@+id/guideline_card_end" + app:layout_constraintStart_toStartOf="@+id/guideline_card_start" app:layout_constraintTop_toBottomOf="@+id/main_test_fetching" app:registerDate="@{submissionViewModel.testResultReceivedDate}" /> @@ -192,8 +192,8 @@ android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_normal" android:visibility="@{FormatterSubmissionHelper.formatShowSubmissionDoneCard(submissionViewModel.deviceUiState)}" - app:layout_constraintEnd_toStartOf="@+id/guideline_end" - app:layout_constraintStart_toStartOf="@+id/guideline_start" + app:layout_constraintEnd_toStartOf="@+id/guideline_card_end" + app:layout_constraintStart_toStartOf="@+id/guideline_card_start" app:layout_constraintTop_toBottomOf="@+id/main_test_positive" /> <androidx.constraintlayout.widget.Barrier @@ -214,10 +214,10 @@ app:icon="@{@drawable/ic_main_about}" app:iconEnd="@{@drawable/ic_forward}" app:layout_constraintBottom_toTopOf="@+id/guideline_bottom" - app:layout_constraintEnd_toStartOf="@+id/guideline_end" app:layout_constraintHorizontal_bias="0.0" - app:layout_constraintStart_toStartOf="@+id/guideline_start" app:layout_constraintTop_toBottomOf="@+id/main_barrier" + app:layout_constraintEnd_toStartOf="@+id/guideline_card_end" + app:layout_constraintStart_toStartOf="@+id/guideline_card_start" app:tracingViewModel="@{tracingViewModel}" /> <include layout="@layout/merge_guidelines_side" /> @@ -229,6 +229,8 @@ android:orientation="horizontal" app:layout_constraintGuide_end="@dimen/spacing_small" /> + <include layout="@layout/merge_guidelines_card" /> + </androidx.constraintlayout.widget.ConstraintLayout> </ScrollView> diff --git a/Corona-Warn-App/src/main/res/layout/fragment_onboarding.xml b/Corona-Warn-App/src/main/res/layout/fragment_onboarding.xml index 5db621d83304e514d0bf03f5ee58c6bd697052cf..1f778ffbca13adb3eaa0da6e5be82818f5626a07 100644 --- a/Corona-Warn-App/src/main/res/layout/fragment_onboarding.xml +++ b/Corona-Warn-App/src/main/res/layout/fragment_onboarding.xml @@ -15,7 +15,7 @@ layout="@layout/include_onboarding" android:layout_width="0dp" android:layout_height="0dp" - android:layout_marginBottom="@dimen/spacing_normal" + android:layout_marginBottom="@dimen/spacing_small" android:focusable="false" app:body="@{@string/onboarding_body}" app:bodyEmphasized="@{@string/onboarding_body_emphasized}" @@ -50,7 +50,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="horizontal" - app:layout_constraintGuide_end="@dimen/guideline_bottom" /> + app:layout_constraintGuide_end="@dimen/spacing_small" /> <androidx.constraintlayout.widget.Guideline android:id="@+id/guideline_start" 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 0a8fa29190e0e997ac7640f9ac753252417893c0..1800f51050ee1f7067070a99771136549596cf41 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 @@ -42,7 +42,7 @@ layout="@layout/include_onboarding" android:layout_width="0dp" android:layout_height="0dp" - android:layout_marginBottom="@dimen/spacing_normal" + android:layout_marginBottom="@dimen/spacing_small" app:body="@{@string/onboarding_notifications_body}" app:headline="@{@string/onboarding_notifications_headline}" app:illustration="@{@drawable/ic_illustration_notification_on}" @@ -75,7 +75,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="horizontal" - app:layout_constraintGuide_end="@dimen/guideline_bottom" /> + app:layout_constraintGuide_end="@dimen/spacing_small" /> <androidx.constraintlayout.widget.Guideline android:id="@+id/guideline_start" 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 90840022a291ac438a09dc4b45c05efb82b9c508..739392b9baa54a2fd903a9b0563132818b62ac74 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 @@ -46,30 +46,19 @@ </androidx.constraintlayout.widget.ConstraintLayout> <include - android:id="@+id/onboarding_privacy" layout="@layout/include_onboarding" - android:layout_width="0dp" - android:layout_height="wrap_content" - android:layout_marginBottom="@dimen/spacing_normal" + android:layout_width="@dimen/match_constraint" + android:layout_height="@dimen/match_constraint" + android:layout_marginBottom="@dimen/spacing_small" app:headline="@{@string/onboarding_privacy_headline}" + app:body="@{FormatterHelper.formatStringAsHTMLFromLocal(@string/information_privacy_html_path)}" app:illustration="@{@drawable/ic_illustration_privacy}" app:illustrationDescription="@{@string/onboarding_privacy_illustration_description}" + app:layout_constraintBottom_toTopOf="@+id/onboarding_button_next" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/onboarding_header" /> - <WebView - android:id="@+id/onboarding_privacy_webview" - android:layout_width="@dimen/match_constraint" - android:layout_height="@dimen/match_constraint" - android:layout_marginBottom="@dimen/spacing_normal" - android:scrollbars="vertical" - app:layout_constraintBottom_toTopOf="@+id/onboarding_button_next" - app:layout_constraintEnd_toEndOf="@id/guideline_end" - app:layout_constraintStart_toStartOf="@id/guideline_start" - app:layout_constraintTop_toBottomOf="@+id/onboarding_privacy" /> - - <Button android:id="@+id/onboarding_button_next" style="@style/buttonPrimary" @@ -92,7 +81,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="horizontal" - app:layout_constraintGuide_end="@dimen/guideline_bottom" /> + app:layout_constraintGuide_end="@dimen/spacing_small" /> <androidx.constraintlayout.widget.Guideline android:id="@+id/guideline_start" 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 71f445ac4bf4cf6cd808abf464b185751977f2fe..8fd19dc34817701fb8c98369ead94a7d7b877639 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 @@ -41,7 +41,7 @@ layout="@layout/include_onboarding" android:layout_width="0dp" android:layout_height="0dp" - android:layout_marginBottom="@dimen/spacing_normal" + android:layout_marginBottom="@dimen/spacing_small" app:body="@{@string/onboarding_test_body}" app:headline="@{@string/onboarding_test_headline}" app:illustration="@{@drawable/ic_illustration_test}" @@ -74,7 +74,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="horizontal" - app:layout_constraintGuide_end="@dimen/guideline_bottom" /> + app:layout_constraintGuide_end="@dimen/spacing_small" /> <androidx.constraintlayout.widget.Guideline android:id="@+id/guideline_start" 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 1097da4a0e0c16586ac43c336944ece3e20f9cc5..dca4457c3534889560cb34e3e355ccc8d678cf52 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 @@ -41,7 +41,7 @@ layout="@layout/include_onboarding" android:layout_width="0dp" android:layout_height="0dp" - android:layout_marginBottom="@dimen/spacing_normal" + android:layout_marginBottom="@dimen/spacing_small" app:body="@{@string/onboarding_tracing_body}" app:bodyCard="@{@string/onboarding_tracing_body_consent}" app:bodyEmphasized="@{@string/onboarding_tracing_body_emphasized}" @@ -88,7 +88,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="horizontal" - app:layout_constraintGuide_end="@dimen/guideline_bottom" /> + app:layout_constraintGuide_end="@dimen/spacing_small" /> <androidx.constraintlayout.widget.Guideline android:id="@+id/guideline_start" 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 e3bcb28864bda4df5747d1d5f5dbc7c853b0f909..943f04f8b9a6072aa1ff2e7003881502d58ef8b9 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 @@ -211,10 +211,10 @@ <TextView android:id="@+id/risk_details_information_body" - style="@style/body2" + style="@style/body1" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_marginTop="@dimen/spacing_small" + 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))}" @@ -224,10 +224,10 @@ <TextView android:id="@+id/risk_details_information_body_notice" - style="@style/body2" + style="@style/body1" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_marginTop="@dimen/spacing_small" + android:layout_marginTop="@dimen/spacing_normal" android:focusable="false" android:text="@string/risk_details_information_body_notice" app:layout_constraintEnd_toEndOf="parent" @@ -259,7 +259,10 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@color/colorSurface1" - android:padding="@dimen/spacing_normal" + android:paddingStart="@dimen/spacing_normal" + android:paddingTop="@dimen/spacing_small" + android:paddingEnd="@dimen/spacing_normal" + android:paddingBottom="@dimen/spacing_small" android:visibility="@{FormatterRiskHelper.formatRiskDetailsButtonVisibility(tracingViewModel.riskLevel, settingsViewModel.isBackgroundJobEnabled())}" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="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 697992636e2278452770d71e76a8dff3ed607db7..475ce156714a527c518ffa48981be302db8924b2 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 @@ -57,6 +57,7 @@ <include android:id="@+id/settings_switch_row_notifications_risk" layout="@layout/include_settings_switch_row" + android:layout_marginTop="@dimen/spacing_tiny" android:layout_width="0dp" android:layout_height="wrap_content" android:visibility="@{FormatterHelper.formatVisibility(settingsViewModel.isNotificationsEnabled())}" 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 d910929b2c3446c3cb02a53deb98ecceb1a6f0bc..9ce4584a3526ce59d90e414c9ab9d4f518ac464a 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 @@ -20,7 +20,7 @@ <ScrollView android:layout_width="0dp" android:layout_height="0dp" - android:layout_marginBottom="@dimen/spacing_normal" + android:layout_marginBottom="@dimen/spacing_small" android:fillViewport="true" app:layout_constraintBottom_toTopOf="@+id/settings_reset_button_delete" app:layout_constraintEnd_toEndOf="parent" @@ -49,7 +49,7 @@ layout="@layout/include_tracing_status_card" android:layout_width="@dimen/match_constraint" android:layout_height="wrap_content" - android:layout_marginTop="@dimen/spacing_normal" + android:layout_marginTop="@dimen/spacing_medium" app:body="@{@string/settings_reset_body_keys}" app:buttonText="@{@string/settings_tracing_status_connection_button}" app:headline="@{@string/settings_reset_headline_keys}" @@ -118,7 +118,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="horizontal" - app:layout_constraintGuide_end="@dimen/guideline_bottom" /> + app:layout_constraintGuide_end="@dimen/spacing_small" /> </androidx.constraintlayout.widget.ConstraintLayout> 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 76eb6cbd5efd4507cfdc67d1c07a298725cb6a4c..4e2f001aaffb49c830a122a1308a2669c5ca49d2 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 @@ -78,46 +78,46 @@ android:layout_width="@dimen/match_constraint" android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_small" - app:layout_constraintEnd_toStartOf="@+id/guideline_card_end" - app:layout_constraintStart_toStartOf="@+id/guideline_card_start" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/settings_tracing_switch_row"> <include android:id="@+id/settings_tracing_status_bluetooth" layout="@layout/include_tracing_status_card" - android:layout_width="match_parent" + android:layout_width="@dimen/match_constraint" android:layout_height="wrap_content" android:visibility="@{FormatterSettingsHelper.formatTracingStatusVisibilityBluetooth(tracingViewModel.isTracingEnabled(), settingsViewModel.isBluetoothEnabled(), settingsViewModel.isConnectionEnabled())}" app:body="@{@string/settings_tracing_status_bluetooth_body}" app:buttonText="@{@string/settings_tracing_status_bluetooth_button}" app:headline="@{@string/settings_tracing_status_bluetooth_headline}" app:icon="@{@drawable/ic_settings_tracing_bluetooth}" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintStart_toStartOf="parent" + app:layout_constraintEnd_toStartOf="@+id/guideline_card_end" + app:layout_constraintStart_toStartOf="@+id/guideline_card_start" app:layout_constraintTop_toTopOf="parent" /> <include android:id="@+id/settings_tracing_status_connection" layout="@layout/include_tracing_status_card" - android:layout_width="match_parent" + android:layout_width="@dimen/match_constraint" android:layout_height="wrap_content" android:visibility="@{FormatterSettingsHelper.formatTracingStatusConnection(tracingViewModel.isTracingEnabled(), settingsViewModel.isBluetoothEnabled(), settingsViewModel.isConnectionEnabled())}" app:body="@{@string/settings_tracing_status_connection_body}" app:buttonText="@{@string/settings_tracing_status_connection_button}" app:headline="@{@string/settings_tracing_status_connection_headline}" app:icon="@{@drawable/ic_settings_tracing_connection}" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintStart_toStartOf="parent" + app:layout_constraintEnd_toStartOf="@+id/guideline_card_end" + app:layout_constraintStart_toStartOf="@+id/guideline_card_start" app:layout_constraintTop_toTopOf="parent" /> <androidx.constraintlayout.widget.ConstraintLayout android:id="@+id/settings_tracing_status_tracing" - android:layout_width="match_parent" + android:layout_width="@dimen/match_constraint" android:layout_height="wrap_content" - android:layout_marginTop="@dimen/spacing_small" + android:layout_marginTop="@dimen/spacing_tiny" android:visibility="@{FormatterSettingsHelper.formatTracingStatusVisibilityTracing(tracingViewModel.isTracingEnabled(), settingsViewModel.isBluetoothEnabled(), settingsViewModel.isConnectionEnabled())}" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintStart_toStartOf="parent" + app:layout_constraintEnd_toStartOf="@+id/guideline_end" + app:layout_constraintStart_toEndOf="@+id/guideline_start" app:layout_constraintTop_toTopOf="parent"> <TextView @@ -143,6 +143,10 @@ </androidx.constraintlayout.widget.ConstraintLayout> + <include layout="@layout/merge_guidelines_card" /> + + <include layout="@layout/merge_guidelines_side" /> + </androidx.constraintlayout.widget.ConstraintLayout> <androidx.constraintlayout.widget.ConstraintLayout @@ -183,8 +187,6 @@ android:orientation="vertical" app:layout_constraintGuide_end="@dimen/guideline_end" /> - <include layout="@layout/merge_guidelines_card" /> - </androidx.constraintlayout.widget.ConstraintLayout> </ScrollView> 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 8e1dca2b7225b1d6032b040dc603ed7a3f2c1cd4..4dcf94459addc323cb377eb555afa07af627be13 100644 --- a/Corona-Warn-App/src/main/res/layout/include_header.xml +++ b/Corona-Warn-App/src/main/res/layout/include_header.xml @@ -17,7 +17,8 @@ <androidx.constraintlayout.widget.ConstraintLayout android:layout_width="match_parent" android:layout_height="@dimen/header_main" - android:padding="@dimen/spacing_tiny"> + android:paddingTop="@dimen/spacing_tiny" + android:paddingBottom="@dimen/spacing_tiny"> <include android:id="@+id/header_button_back" 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 20c19d008de26c7d0ba8e494a2b72119a9e14d3c..6e97b1bac62e622b2eb8c1eed05c7bce85347cd3 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 @@ -21,7 +21,7 @@ <variable name="body" - type="String" /> + type="CharSequence" /> </data> <androidx.constraintlayout.widget.ConstraintLayout @@ -49,6 +49,7 @@ style="@style/headline5" android:layout_width="0dp" android:layout_height="wrap_content" + android:layout_marginTop="@dimen/spacing_small" android:text="@{headline}" android:visibility="@{FormatterHelper.formatVisibilityText(headline)}" app:layout_constraintEnd_toEndOf="parent" @@ -61,7 +62,7 @@ style="@style/subtitle" android:layout_width="0dp" android:layout_height="wrap_content" - android:layout_marginTop="@dimen/spacing_small" + android:layout_marginTop="@dimen/spacing_medium" 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_onboarding.xml b/Corona-Warn-App/src/main/res/layout/include_onboarding.xml index 83c66263c6a1d9b1b13d5d2395fc26a7d44ee7e6..03d9af5c84b9f0f5a26ce68bdeb9ba6a6687885a 100644 --- a/Corona-Warn-App/src/main/res/layout/include_onboarding.xml +++ b/Corona-Warn-App/src/main/res/layout/include_onboarding.xml @@ -79,7 +79,7 @@ style="@style/subtitle" android:layout_width="0dp" android:layout_height="wrap_content" - android:layout_marginTop="@dimen/spacing_small" + android:layout_marginTop="@dimen/spacing_normal" android:focusable="false" android:text="@{subtitle}" android:visibility="@{FormatterHelper.formatVisibilityText(subtitle)}" @@ -120,7 +120,7 @@ layout="@layout/include_tracing_status_card" android:layout_width="@dimen/match_constraint" android:layout_height="wrap_content" - android:layout_marginTop="@dimen/spacing_normal" + android:layout_marginTop="@dimen/spacing_large" android:visibility="@{FormatterHelper.formatVisibilityText(headlineCard)}" app:body="@{bodyCard}" app:headline="@{headlineCard}" 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 8d6e6673b3629a5da9ac56fb371fb46b1d683172..4d85a537f3f856cd865a1756c04b7b6db3c381cb 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 @@ -42,7 +42,7 @@ android:layout_height="@dimen/icon_size_risk_card" android:importantForAccessibility="no" android:src="@drawable/ic_forward" - android:tint="@{FormatterRiskHelper.formatStableIconColor(tracingViewModel.riskLevel)}" + android:tint="@{FormatterRiskHelper.formatStableTextColor(tracingViewModel.riskLevel)}" android:visibility="@{FormatterHelper.formatVisibilityInverted(showDetails)}" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toTopOf="parent" /> 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 cfa05b1926bf149568f3f8e909dd0f4e01c4b24b..6b9bf12b200739e2252ff55fb8bdbcd008d44342 100644 --- a/Corona-Warn-App/src/main/res/values-de/strings.xml +++ b/Corona-Warn-App/src/main/res/values-de/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 @@ -46,6 +45,8 @@ <!-- NOTR --> <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> + <!-- NOTR --> <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> @@ -64,12 +65,23 @@ <!-- NOTR --> <string name="preference_last_three_hours_from_server"><xliff:g id="preference">"preference_last_three_hours_from_server"</xliff:g></string> + <!-- #################################### + Generics + ###################################### --> + + <!-- XACT: back description for screen readers --> + <string name="accessibility_back">"Zurück"</string> + <!-- XACT: next description for screen readers --> + <string name="accessibility_next">"Weiter"</string> + <!-- XACT: menu description for screen readers --> + <string name="accessibility_menu">"Menü"</string> + <!-- XACT: menu description for screen readers --> + <string name="accessibility_close">"Schließen"</string> + <!-- #################################### Menu ###################################### --> - <!-- Todo pluralize strings when necessary --> - <!-- Todo include date formats when necessary --> <!-- XMIT: application overview --> <string name="menu_help">"Ãœberblick"</string> <!-- XMIT: application information --> @@ -84,28 +96,48 @@ <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> + <!-- XTXT: Notification channel name for os settings --> <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> + <!-- XHED: Notification title --> <string name="notification_headline">"Corona-Warn-App"</string> + <!-- XTXT: Notification body --> <string name="notification_body">"Es gibt Neuigkeiten von Ihrer Corona-Warn-App."</string> + <!-- #################################### + App Auto Update + ###################################### --> + + <!-- XHED: App Auto Update dialog title --> + <string name="update_dialog_title">"Update verfügbar"</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> + <!-- XBUT: App Auto Update button --> + <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> + <!-- XTXT: risk card - number of contacts for one or more --> <plurals name="risk_card_body_contact_value"> <item quantity="one">"%1$s Risiko-Begegnung"</item> <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> + <!-- 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 --> <string name="risk_card_body_time_fetched">"Aktualisiert: %1$s"</string> + <!-- XTXT: risk card - next update --> <string name="risk_card_body_next_update">"Tägliche Aktualisierung"</string> <!-- XBUT: risk card - update risk --> <string name="risk_card_button_update">"Aktualisieren"</string> + <!-- XBUT: risk card - update risk with time display --> <string name="risk_card_button_cooldown">"Aktualisierung in %1$s"</string> <!-- XBUT: risk card - activate tracing --> <string name="risk_card_button_enable_tracing">"Risiko-Ermittlung einschalten"</string> @@ -115,6 +147,7 @@ <string name="risk_card_low_risk_headline">"Niedriges Risiko"</string> <!-- XHED: risk card - increased risk headline --> <string name="risk_card_increased_risk_headline">"Erhöhtes Risiko"</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> @@ -125,6 +158,7 @@ <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> <!-- XHED: risk card - tracing stopped headline, due to no possible calculation --> <string name="risk_card_no_calculation_possible_headline">"Risiko-Ermittlung gestoppt"</string> + <!-- XTXT: risk card - last successfully calculated risk level --> <string name="risk_card_no_calculation_possible_body_saved_risk">"Letzte Risiko-Ermittlung:"<xliff:g id="line_break">"\n"</xliff:g>"%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> @@ -145,7 +179,8 @@ <string name="main_about_body">"Hier finden Sie Antworten auf häufig gestellte Fragen rund um die Corona-Warn-App."</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> <!-- #################################### Main - Share ###################################### --> @@ -169,6 +204,8 @@ <!-- XHED: App overview page title --> <string name="main_overview_title">"Ãœberblick"</string> + <!-- XACT: main overview page title --> + <string name="main_overview_accessibility_title">"Ãœberblick"</string> <!-- XHED: App overview subtitle for tracing explanation--> <string name="main_overview_subtitle_tracing">"Risiko-Ermittlung"</string> <!-- YTXT: App overview body text about tracing --> @@ -213,11 +250,15 @@ <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> <!-- 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> <!-- #################################### Risk Details ###################################### --> + <!-- XHED: risk details - page title, in toolbar --> + <string name="risk_details_title">"Ihr Risikostatus"</string> <!-- XHED: risk details - headline, how a user should act --> <string name="risk_details_headline_behavior">"Verhalten"</string> <!-- XHED: risk details - multiline headline, bold, how to act correct --> @@ -225,11 +266,11 @@ <!-- 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> <!-- 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 Absonderungsmaßnahmen, wenden Sie sich bitte an eine der folgenden Stellen:"</string> + <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 --> <string name="risk_details_behavior_body_wash_hands">"Waschen Sie Ihre Hände regelmäßig."</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">"Tragen Sie einen Mundschutz bei Begegnungen mit anderen Personen."</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> <!-- XMSG: risk details - cough/sneeze, something like a bullet point --> @@ -237,7 +278,7 @@ <!-- XMSG: risk details - contact your doctor, bullet point --> <string name="risk_details_behavior_increased_body_1">"Ihre Hausärztin/Ihren Hausarzt"</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 Notdienst 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 --> @@ -250,27 +291,41 @@ <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> <!-- XMSG: risk details - risk calculation wasn't possible for 24h, below behaviors --> <string name="risk_details_information_body_outdated_risk">"Ihre Risiko-Ermittlung konnte seit mehr als 24 Stunden nicht aktualisiert werden."</string> - <string name="risk_details_information_body_low_risk">"Sie haben ein niedriges Infektionsrisiko, da keine Begegnung mit nachweislich Corona-positiv getesteten Personen aufgezeichnet wurde oder sich Ihre Begegnung auf kurze Zeit und einen größeren Abstand beschränkt hat."</string> <!-- final --> + <!-- 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 Corona-positiv getesteten Personen aufgezeichnet wurde oder sich Ihre Begegnung auf kurze Zeit und einen größeren Abstand beschränkt hat."</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> </plurals> - <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> <!-- final --> + <!-- 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> + <!-- 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> <!-- #################################### Onboarding ###################################### --> <string name="onboarding_image_description">"IS MISSING"</string> + <!-- XBUT: onboarding - forward and deny --> <string name="onboarding_button_disable">"Nicht aktivieren"</string> + <!-- XBUT: onboarding - forward and allow --> + <string name="onboarding_button_enable">"Aktivieren"</string> + <!-- XBUT: onboarding - back and cancel --> + <string name="onboarding_button_cancel">"Abbrechen"</string> <!-- XBUT: onboarding - next --> <string name="onboarding_button_next">"Weiter"</string> <!-- XBUT: onboarding - start --> <string name="onboarding_button_start">"Los geht’s"</string> <!-- XTXT: onboarding - back description for screen reader --> <string name="onboarding_button_back_description">"Zurück"</string> + <!-- XACT: Onboarding (together) page title --> + <string name="onboarding_onboarding_accessibility_title">"Einführung Seite 1 von 5: Gemeinsam Corona bekämpfen"</string> <!-- XHED: onboarding(together) - fight corona --> <string name="onboarding_headline">"Gemeinsam Corona bekämpfen"</string> <!-- XHED: onboarding(together) - two/three line headline under an illustration --> @@ -281,8 +336,15 @@ <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> <!-- 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> + <!-- XHED: onboarding(privacy) - title --> + <string name="onboarding_privacy_headline">"Datenschutz"</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> + <!-- 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> <!-- 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 --> @@ -291,16 +353,24 @@ <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 --> <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> + <!-- XHED: onboarding(tracing) - headline for consent information --> + <string name="onboarding_tracing_headline_consent">"Einwilligungserklärung"</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> + <!-- XBUT: onboarding(tracing) - button enable tracing --> + <string name="onboarding_tracing_button_next">"Risiko-Ermittlung aktivieren"</string> <!-- XTXT: onboarding(tracing) - dialog about tracing permission declined --> <string name="onboarding_tracing_dialog_headline">"Berechtigung"</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">"Corona-Warn-App kann dadurch keine Benachrichtigungen zum COVID-19-Risikostatus versenden und empfangen. Sie können die Funktion jederzeit ausschalten."</string> <!-- XBUT: onboarding(tracing) - positive button (right) --> <string name="onboarding_tracing_dialog_button_positive">"Nicht aktivieren"</string> <!-- XBUT: onboarding(tracing) - negative button (right) --> <string name="onboarding_tracing_dialog_button_negative">"Zurück"</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">"Drei Personen haben die Risiko-Ermittlung auf ihren Smartphones aktiviert, ihre Begegnung wird daher aufgezeichnet."</string> + <!-- XACT: Onboarding (test) page title --> + <string name="onboarding_test_accessibility_title">"Einführung Seite 4 von 5: Falls Sie positiv getestet wurden"</string> <!-- XHED: onboarding(test) - about positive tests --> <string name="onboarding_test_headline">"Falls Sie Corona-positiv getestet werden ..."</string> <!-- XHED: onboarding(test) - two/three line headline under an illustration --> @@ -309,6 +379,8 @@ <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> <!-- 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> + <!-- XACT: Onboarding (datashare) page title --> + <string name="onboarding_notifications_accessibility_title">"Einführung Seite 5 von 5: Warnungen erhalten und Risiken erkennen"</string> <!-- XHED: onboarding(datashare) - about positive tests --> <string name="onboarding_notifications_headline">"Warnungen erhalten, Risiken kennen"</string> <!-- XHED: onboarding(datashare) - two/three line headline under an illustration --> @@ -333,7 +405,7 @@ <!-- XHED: settings(tracing) - headline bellow illustration --> <string name="settings_tracing_headline">"So funktioniert die Begegnungs-Aufzeichnung"</string> <!-- XTXT: settings(tracing) - explain text in settings overview under headline --> - <string name="settings_tracing_body_description">"Erlauben Sie Erfassung und Weitergabe von Covid-19 Zufallscodes."</string> + <string name="settings_tracing_body_description">"Erlauben Sie Erfassung und Weitergabe von COVID-19-Zufallscodes."</string> <!-- XTXT: settings(tracing) - shows status under header in home, active --> <string name="settings_tracing_body_active">"Risiko-Ermittlung aktiv"</string> <!-- XTXT: settings(tracing) - shows status under header in home, inactive --> @@ -368,23 +440,23 @@ <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> </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">"Drei Personen haben die Risiko-Ermittlung auf ihren Smartphones aktiviert, ihre Begegnung wird daher aufgezeichnet."</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">"Eine Person hat die Risiko-Ermittlung auf ihrem Smartphone ausgeschaltet, eine Begegnung mit zwei weiteren Personen wird daher nicht aufgezeichnet."</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> <!-- XACT: settings(tracing) - describes illustration --> - <string name="settings_tracing_connection_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_connection_illustration_description_inactive">"Eine Person hat die Internetverbindung auf ihrem Smartphone ausgeschaltet, eine Begegnung mit zwei weiteren Personen wird daher nicht aufgezeichnet."</string> <!-- XHED: settings(notification) - notification page title --> <string name="settings_notifications_title">"Mitteilungen"</string> <!-- XHED: settings(notification) - multiline headline below illustration, active --> - <string name="settings_notifications_headline_active">"Möchten Sie Mitteilungen zu Ihrem Covid-19-Risikostatus aktivieren?"</string> + <string name="settings_notifications_headline_active">"Möchten Sie Mitteilungen zu Ihrem COVID-19-Risikostatus aktivieren?"</string> <!-- XHED: settings(notification) - multiline headline below illustration, inactive --> <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 Mitteilungen zu Covid-19-Risikostatus."</string> - <string name="settings_notifications_body_active">"Legen Sie fest, zu welchen Themen Sie informiert beiben möchten."</string> + <string name="settings_notifications_body_description">"Erlauben Sie automatische Benachrichtigungen zu COVID-19-Risikostatus."</string> + <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 headline on settings overview --> @@ -392,7 +464,7 @@ <!-- XTXT: settings(notification) - next to a switch --> <string name="settings_notifications_subtitle_update_risk">"Ändern Ihres Infektionsrisikos"</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 Ihres Coronavirus-Tests"</string> <!-- XBUT: settings(notification) - go to operating settings --> <string name="settings_notifications_button_open_settings">"Geräte-Einstellungen öffnen"</string> <!-- XACT: main (overview) - illustraction description, explanation image, displays notificatin status, active --> @@ -441,11 +513,16 @@ <string name="information_privacy_title">"Datenschutzinformation"</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> + <!-- 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> <!-- 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_headline">@string/lorem_ipsum</string> + <!-- XHED: Page headline for terms of use information page --> + <string name="information_terms_headline">"Inhalt"</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> + <!-- 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> <!-- XHED: Page title for technical contact and hotline information page, also menu item / button text --> <string name="information_contact_title">"Technische Hotline"</string> <!-- XHED: Subtitle for technical contact and hotline information page --> @@ -456,14 +533,14 @@ <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, NO SPECIAL CHARACTERS EXCEPT "+" and "space" todo phone number to be called replace in english file --> - <string name="information_contact_phone_call_number">+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; todo phone number to be called replace in english file --> + <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> <!-- 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">"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 --> @@ -472,8 +549,24 @@ <string name="information_technical_title">"Rechtliche Hinweise"</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> + <!-- 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> <!-- XHED: Page title for legal information page, also menu item / button text --> <string name="information_legal_title">"Impressum"</string> + <!-- XHED: Headline for legal information page, publisher section --> + <string name="information_legal_headline_publisher">"Herausgeber"</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> + <!-- 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> + <!-- 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> + <!-- XHED: Headline for legal information page, tax section --> + <string name="information_legal_headline_taxid">"Umsatzsteueridentifikationsnummer"</string> + <!-- YTXT: subtitle for legal information page, tax section --> + <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> @@ -494,7 +587,7 @@ <!-- XHED: Dialog title for already paired test error --> <string name="submission_error_dialog_web_test_paired_title">"Fehler"</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-InfoInformationen → Technische Hotline."</string> + <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 → Technische Hotline."</string> <!-- XBUT: Positive button for already paired test error --> <string name="submission_error_dialog_web_test_paired_button_positive">"Zurück"</string> @@ -513,20 +606,28 @@ <string name="submission_error_dialog_web_tan_invalid_button_positive">"Zurück"</string> <!-- Permission Rationale Dialog --> - <string name="submission_qr_code_scan_permission_rationale_dialog_headline">"Kamera-Berechtigung benötigt"</string> - <string name="submission_qr_code_scan_permission_rationale_dialog_body">"Bitte erlauben Sie die Autorisierung der Kamera für das Scannen von QR-Codes."</string> + <!-- XHED: Dialog headline QR Scan permission rationale --> + <string name="submission_qr_code_scan_permission_rationale_dialog_headline">"Kamera-Zugriff benötigt"</string> + <!-- YTXT: Dialog Body text for QR Scan permission rationale --> + <string name="submission_qr_code_scan_permission_rationale_dialog_body">"Bitte erlauben Sie der App die Benutzung der Kamera, um den QR-Code zu scannen."</string> + <!-- XBUT: Dialog(QR Scan permission rationale) - positive button (right) --> <string name="submission_qr_code_scan_permission_rationale_dialog_button_positive">"Erlauben"</string> + <!-- 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 --> - <string name="submission_qr_code_scan_invalid_dialog_headline">"Falscher QR-Code"</string> - <string name="submission_qr_code_scan_invalid_dialog_body">"Es scheint, dass der falsche QR-Code gescannt wurde."</string> + <!-- 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 --> + <string name="submission_qr_code_scan_invalid_dialog_body">"Der QR-Code ist nicht korrekt. Bitte versuchen Sie es erneut."</string> + <!-- XBUT: Dialog(Invalid QR code) - positive button (right) --> <string name="submission_qr_code_scan_invalid_dialog_button_positive">"Erneut versuchen"</string> + <!-- XBUT: Dialog(Invalid QR code) - negative button (left) --> <string name="submission_qr_code_scan_invalid_dialog_button_negative">"Abbrechen"</string> <!-- QR Code Scan Screen --> <!-- 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">"Positionieren Sie den QR-Code in den Rahmen."</string> <!-- Submission Test Result --> <!-- XHED: Page headline for test result --> @@ -575,6 +676,18 @@ <string name="submission_test_result_dialog_tracing_required_message">"Bitte aktivieren Sie die Risiko-Ermittlung, um andere zu warnen."</string> <!-- XBUT: tracing required : OK button --> <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> + <!-- 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> + <!-- XBUT: Positive button for test removal --> + <string name="submission_test_result_dialog_remove_test_button_positive">"Entfernen"</string> + <!-- XBUT: Negative button for test removal --> + <string name="submission_test_result_dialog_remove_test_button_negative">"Abbrechen"</string> + <!-- XHED: Title for test result card positive --> + <string name="submission_test_result_card_positive_title">"SARS-CoV-2 positiv"</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> <!-- Submission Tan --> <!-- XHED: Page title for TAN submission pge --> @@ -583,6 +696,12 @@ <string name="submission_tan_body">"Geben Sie bitte die 10 Stellen der TAN ein, die Ihnen mitgeteilt wurde."</string> <!-- XBUT: Submit TAN button --> <string name="submission_tan_button_text">"Weiter"</string> + <!-- XACT: Submission Tan page title --> + <string name="submission_tan_accessibility_title">"TAN-Eingabe"</string> + <!-- YTXT: Error text for the tan submission page --> + <string name="submission_tan_error">"Ungültige TAN, bitte überprüfen Sie Ihre Eingabe."</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> <!-- Submission Intro --> <!-- XHED: Page title for menu at the start of the submission process --> @@ -593,6 +712,17 @@ <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> <!-- XBUT: Submission introduction next button--> <string name="submission_intro_button_next">"Weiter"</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> + <!-- YTXT: submission introduction bullet points --> + <string-array name="submission_intro_bullet_points"> + <item>"Wenn Sie Corona-positiv getestet wurden, können Sie andere warnen."</item> + <item>"Wenn Ihnen für einen positiven Testbefund 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> + </string-array> + <!-- XACT: Submission Intro page title --> + <string name="submission_intro_accessibility_title">"Wurden Sie getestet? So funktioniert das Corona-Warn-System"</string> + <!-- Notification --> <!-- XHED: Dialog headline for result dialog --> @@ -610,8 +740,8 @@ <!-- 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-Dokuments scannen."</string> <!-- XHED: Dialog headline for dispatcher QR prviacy dialog --> - <string name="submission_dispatcher_qr_privacy_dialog_headline">"Datenschutz"</string> - <string name="submission_dispatcher_qr_privacy_dialog_body">@string/lorem_ipsum</string> + <string name="submission_dispatcher_qr_privacy_dialog_headline">"Einwilligungserklärung"</string> + <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> <!-- XBUT: submission(dispatcher QR Dialog) - negative button (left) --> @@ -624,6 +754,8 @@ <string name="submission_dispatcher_card_tan_tele">"Noch keine TAN?"</string> <!-- YTXT: Body text for TELE_TAN dispatcher option --> <string name="submission_dispatcher_tan_tele_card_text">"Bitte rufen Sie uns an, falls Sie Corona-positiv getestet wurden."</string> + <!-- XACT: Dispatcher Tan page title --> + <string name="submission_dispatcher_accessibility_title">"Welche Informationen liegen Ihnen vor?"</string> <!-- Submission Positive Other Warning --> <!-- XHED: Page title for the positive result additional warning page--> @@ -635,7 +767,7 @@ <!-- XHED: Title for the privacy card--> <string name="submission_positive_other_warning_privacy_title">"Datenschutz"</string> <!-- YTXT: Body text for the privacy card--> - <string name="submission_positive_other_warning_privacy_body">"Ich willige hiermit ein, dass mein positiver Corona-Befund an das Tracing Backend übermittelt und dazu genutzt wird, andere App Nutzer auf ein mögliches Infektionsrisiko hinzuweisen. Dabei werden die auf meinem Gerät gespeicherten Temporary Exposure Keys an das Tracing Backend übermittelt und dort anderen Nutzern der App zur Verfügung gestellt. Ich kann meine Einwilligung jederzeit mit Wirkung für die Zukunft widerrufen. Ein Widerruf lässt die Rechtmäßigkeit der Verarbeitung bis zum Widerruf unberührt.\n\nWeitere Informationen finden Sie in unserer Datenschutzhinweisen."</string> + <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> <!-- XBUT: other warning continue button --> <string name="submission_positive_other_warning_button">"Weiter"</string> <!-- XHED: Dialog title for positive other warning dialog --> @@ -665,6 +797,13 @@ <string name="submission_done_isolate">"Bitte isolieren Sie sich von anderen Personen."</string> <!-- XHED: Title for further info --> <string name="submission_done_further_info_title">"Weitere Infos:"</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> + </string-array> <!-- XBUT: submission finished button --> <string name="submission_done_button_done">"Fertig"</string> <!-- XACT: submission finished - illustration description, explanation image --> @@ -676,18 +815,28 @@ <!-- XHED: Page headline for contact page in submission flow --> <string name="submission_contact_headline">"Info zum Ablauf:"</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">"Wir teilen Ihnen Ihre TAN gerne per Telefon mit."</string> <!-- XBUT: submission contact call button --> <string name="submission_contact_button_call">"Anrufen"</string> <!-- XBUT: submission contact enter tan button --> <string name="submission_contact_button_enter">"TAN eingeben"</string> <!-- 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_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> + <!-- 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 2 --> + <string name="submission_contact_step_2_content">"Im zweiten Schritt registrieren Sie den Test per TAN-Eingabe in der App."</string> <!-- Submission Status Card --> <!-- XHED: Page title for the various submission status: fetching --> @@ -698,12 +847,18 @@ <string name="submission_status_card_title_pending">"Ergebnis liegt noch nicht vor"</string> <!-- XHED: Page title for the various submission status: available --> <string name="submission_status_card_title_available">"Ihr Ergebnis liegt vor"</string> + <!-- 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> + <!-- 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> <!-- 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 dauert zwischen 1-3 Tagen."</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 --> @@ -713,7 +868,7 @@ <!-- XBUT: submission status card unregistered button --> <string name="submission_status_card_button_unregistered">"Informieren & mitmachen"</string> <!-- XBUT: submission status card show results button --> - <string name="submission_status_card_button_show_results">"Ergebnis anzeigen"</string> + <string name="submission_status_card_button_show_results">"Test anzeigen"</string> <!-- XHED: submission status card positive result title --> <string name="submission_status_card_positive_result_title">"Positives Ergebnis"</string> <!-- XHED: submission status card positive result subtitle --> @@ -721,7 +876,9 @@ <!-- XBUT: submission status card show positive result button --> <string name="submission_status_card_positive_result_show_button">"Testergebnis anzeigen"</string> <!-- YTXT: text for contagious card --> - <string name="submission_status_card_positive_result_contagious">@string/submission_done_contagious</string> + <string name="submission_status_card_positive_result_contagious">"Sie sind ansteckend. Isolieren Sie sich von anderen Personen."</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> <!-- 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> @@ -739,17 +896,43 @@ <string name="test_result_card_status_invalid">"Auswertung nicht möglich"</string> <!-- YTXT: pending status text --> <string name="test_result_card_status_pending">"Ergebnis liegt noch nicht vor"</string> + <!-- XHED: Title for further info of test result negative --> + <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>"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> <!-- XBUT: submission result dialog close button --> <string name="submission_result_button_dialog_close">"Ok"</string> + + <!-- #################################### + Button Tooltips for Accessibility + ###################################### --> + <!-- XACT: back button--> + <string name="button_back">"Zurück zur vorherigen Seite"</string> + <!-- XACT: proceed button--> + <string name="button_proceed">"Fortfahren Button"</string> + <!-- XACT: share button--> + <string name="button_share">"Teilen"</string> + <!-- XACT: menu button--> + <string name="button_menu">"Menü"</string> + <!-- #################################### Generic Error Messages ###################################### --> + <!-- XHED: error dialog - headline --> <string name="errors_generic_headline">"Etwas ist schief gelaufen."</string> + <!-- XTXT: error dialog - short text for error reason --> <string name="errors_generic_details_headline">"Ursache"</string> + <!-- XBUT: error dialog - button close --> <string name="errors_generic_button_positive">"Okay"</string> + <!-- XBUT: error dialog - button show details --> <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 unbekannter Fehler ist aufgetreten."</string> <!-- #################################### 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 dbf0fe5bd32052cd266925332a2b3442a6ac73e5..b08dace6f87db062be53f171490615c46d17c046 100644 --- a/Corona-Warn-App/src/main/res/values-en/strings.xml +++ b/Corona-Warn-App/src/main/res/values-en/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 @@ -46,6 +45,8 @@ <!-- NOTR --> <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> + <!-- NOTR --> <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> @@ -64,12 +65,23 @@ <!-- NOTR --> <string name="preference_last_three_hours_from_server"><xliff:g id="preference">"preference_last_three_hours_from_server"</xliff:g></string> + <!-- #################################### + Generics + ###################################### --> + + <!-- XACT: back description for screen readers --> + <string name="accessibility_back">"Back"</string> + <!-- XACT: next description for screen readers --> + <string name="accessibility_next">"Next"</string> + <!-- XACT: menu description for screen readers --> + <string name="accessibility_menu">"Menu"</string> + <!-- XACT: menu description for screen readers --> + <string name="accessibility_close">"Close"</string> + <!-- #################################### Menu ###################################### --> - <!-- Todo pluralize strings when necessary --> - <!-- Todo include date formats when necessary --> <!-- XMIT: application overview --> <string name="menu_help">"Overview"</string> <!-- XMIT: application information --> @@ -84,28 +96,48 @@ <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> + <!-- XTXT: Notification channel name for os settings --> <string name="notification_name">"Corona-Warn-App"</string> + <!-- XTXT: Notification channel description for os settings --> <string name="notification_description">"Notifications from the Corona-Warn-App"</string> + <!-- XHED: Notification title --> <string name="notification_headline">"Corona-Warn-App"</string> + <!-- XTXT: Notification body --> <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 available"</string> + <!-- XTXT: App Auto Update dialog message --> + <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> + <!-- #################################### Risk Card ###################################### --> <!-- XTXT: risk card - no contact yet --> - <string name="risk_card_body_contact">"No exposures up to now."</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 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 of 14 days saved"</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 --> <string name="risk_card_body_time_fetched">"Updated: %1$s"</string> + <!-- XTXT: risk card - next update --> <string name="risk_card_body_next_update">"Updated daily"</string> <!-- XBUT: risk card - update risk --> <string name="risk_card_button_update">"Update"</string> + <!-- 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> @@ -115,6 +147,7 @@ <string name="risk_card_low_risk_headline">"Low Risk"</string> <!-- XHED: risk card - increased risk headline --> <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 day since the last encounter"</item> <item quantity="other">"%1$s days since the last encounter"</item> @@ -125,15 +158,16 @@ <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> <!-- XHED: risk card - tracing stopped headline, due to no possible calculation --> <string name="risk_card_no_calculation_possible_headline">"Risk identification 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> <!-- 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">"Risk identification 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 risk identification 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 @@ -144,8 +178,9 @@ <!-- 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> <!-- NOTR --> - <string name="main_about_link">"http://www.bundesregierung.de/corona-warn-app-faq-englisch"</string> - + <string name="main_about_link">"https://www.bundesregierung.de/corona-warn-app-faq"</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> <!-- #################################### Main - Share ###################################### --> @@ -153,7 +188,7 @@ <!-- XHED: Share app link page title --> <string name="main_share_title">"Share the Corona-Warn-App"</string> <!-- XHED: Share app link page subtitle --> - <string name="main_share_headline">"Let\'s fight coronavirus together."</string> + <string name="main_share_headline">"Let\'s fight coronavirus together"</string> <!-- YTXT: Share app link page body --> <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 --> @@ -169,6 +204,8 @@ <!-- XHED: App overview page title --> <string name="main_overview_title">"Overview"</string> + <!-- 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> <!-- YTXT: App overview body text about tracing --> @@ -213,23 +250,27 @@ <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> <!-- 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 --> + <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">"Your Risk Level"</string> <!-- XHED: risk details - headline, how a user should act --> <string name="risk_details_headline_behavior">"Behavioral 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> <!-- XMSG: risk details - go/stay home, something like a bullet point --> - <string name="risk_details_behavior_body_stay_home">"Go home immediately and stay at home."</string> + <string name="risk_details_behavior_body_stay_home">"Please go home as soon as you can, 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> <!-- 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 are close to other people."</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">"Keep at least 1.5 metres distance from other people."</string> <!-- XMSG: risk details - cough/sneeze, something like a bullet point --> @@ -243,36 +284,50 @@ <!-- 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 was calculated"</string> + <string name="risk_details_subtitle_infection_risk_past">"This is how your risk level 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 is calculated"</string> + <string name="risk_details_subtitle_infection_risk">"This is how your risk level 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> <!-- 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_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> <!-- final --> + <!-- 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 --> <plurals name="risk_details_information_body_increased_risk"> <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> - <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> <!-- final --> + <!-- 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> + <!-- 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> <!-- #################################### Onboarding ###################################### --> <string name="onboarding_image_description">"IS MISSING"</string> + <!-- XBUT: onboarding - forward and deny --> <string name="onboarding_button_disable">"Do Not Activate"</string> + <!-- XBUT: onboarding - forward and allow --> + <string name="onboarding_button_enable">"Activate"</string> + <!-- XBUT: onboarding - back and cancel --> + <string name="onboarding_button_cancel">"Cancel"</string> <!-- XBUT: onboarding - next --> <string name="onboarding_button_next">"Next"</string> <!-- XBUT: onboarding - start --> <string name="onboarding_button_start">"Let’s Get Started"</string> <!-- XTXT: onboarding - back description for screen reader --> <string name="onboarding_button_back_description">"Back"</string> + <!-- XACT: Onboarding (together) page title --> + <string name="onboarding_onboarding_accessibility_title">"Onboarding page 1 of 5: Fighting coronavirus together"</string> <!-- XHED: onboarding(together) - fight corona --> - <string name="onboarding_headline">"Let\'s fight coronavirus together."</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">"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 --> @@ -281,9 +336,15 @@ <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">"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> + <!-- 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> <!-- XHED: onboarding(tracing) - how to enable tracing --> <string name="onboarding_tracing_headline">"How to Enable Risk Identification"</string> <!-- XHED: onboarding(tracing) - two/three line headline under an illustration --> @@ -292,6 +353,12 @@ <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> <!-- 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> + <!-- XBUT: onboarding(tracing) - button enable tracing --> + <string name="onboarding_tracing_button_next">"Activate risk identification"</string> <!-- XTXT: onboarding(tracing) - dialog about tracing permission declined --> <string name="onboarding_tracing_dialog_headline">"Authorization"</string> <!-- YMSI: onboarding(tracing) - dialog about tracing --> @@ -301,17 +368,21 @@ <!-- 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 exposure logging on their devices, which will log their encounters with each other."</string> + <string name="onboarding_tracing_illustration_description">"Three people have activated risk identification 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 notify this in the Corona-Warn-App. This is voluntary and secure. Do it for the sake of everyone\'s health."</string> + <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> <!-- 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 --> <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">"Onboarding page 5 of 5: Receive warnings and identify risks"</string> <!-- XHED: onboarding(datashare) - about positive tests --> - <string name="onboarding_notifications_headline">"Receive Warnings and Identify Risks"</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">"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 --> @@ -365,27 +436,26 @@ <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 less than 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 less than %1$s days.\nAn exposure check can only be reliable if risk identification is permanently activated."</item> - <item quantity="zero">"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">"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> </plurals> <!-- XACT: settings(tracing) - describes illustration --> - <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> + <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> <!-- XACT: settings(tracing) - describes illustration --> - <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> + <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> <!-- XACT: settings(tracing) - describes illustration --> - <string name="settings_tracing_bluetooth_illustration_description_inactive">"One person has deactivated Bluetooth on the device, so an encounter with two other people is not logged."</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">"One person has deactivated exposure logging on their device, so an encounter with two other people is not logged."</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">"Notifications"</string> <!-- XHED: settings(notification) - multiline headline below illustration, active --> <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">"Notifications are deactivated."</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">"Allow automatic notifications of COVID-19 risk status"</string> + <string name="settings_notifications_body_description">"Allow automatic notifications of COVID-19 risk level"</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">"To activate notifications, you have to allow notifications for the Corona-Warn-App in your device settings."</string> @@ -440,16 +510,21 @@ <!-- 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 --> - <string name="information_privacy_title">"Data protection information"</string> + <string name="information_privacy_title">"Data Privacy Information"</string> <!-- XACT: describes illustration --> <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_en.html"</string> <!-- XHED: Page title for terms of use information page, also menu item / button text --> <string name="information_terms_title">"Terms of Use"</string> - <string name="information_terms_headline">@string/lorem_ipsum</string> + <!-- XHED: Page headline for terms of use information page --> + <string name="information_terms_headline">"Inhalt"</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 --> + <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">"Technical hotline"</string> + <string name="information_contact_title">"Technical Hotline"</string> <!-- XHED: Subtitle for technical contact and hotline information page --> <string name="information_contact_headline">"How can we help you?"</string> <!-- YTXT: Body text for technical contact and hotline information page --> @@ -458,8 +533,8 @@ <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, NO SPECIAL CHARACTERS EXCEPT "+" and "space" todo phone number to be called replace in english file --> - <string name="information_contact_phone_call_number">+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; todo phone number to be called replace in english file --> + <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 --> @@ -471,11 +546,27 @@ <!-- XLNK: Menu item / hyper link / button text for navigation to FAQ website --> <string name="information_help_title">"FAQ"</string> <!-- XHED: Page title for technical information page, also menu item / button text --> - <string name="information_technical_title">"Legal Notes"</string> + <string name="information_technical_title">"Legal Notices"</string> <!-- XACT: describes illustration --> <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_en.html"</string> <!-- XHED: Page title for legal information page, also menu item / button text --> <string name="information_legal_title">"Publication Details"</string> + <!-- 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> + <!-- 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> + <!-- 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> + <!-- 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 --> + <string name="information_legal_subtitle_taxid">"DE 165 893 430"</string> <!-- XACT: describes illustration --> <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> @@ -496,34 +587,42 @@ <!-- 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. The 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> <!-- XHED: Dialog title for could not create submission tan --> <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">"A TAN for submission could not be generated. Please contact the technical hotline via App Information → Technical hotline."</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">"Back"</string> <!-- XHED: Dialog title for submission tan invalid --> <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">"A TAN for submission could not be generated. Please contact the technical hotline via App Information → Technical hotline."</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">"Back"</string> <!-- Permission Rationale Dialog --> + <!-- XHED: Dialog headline QR Scan permission rationale --> <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">"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">"Allow"</string> + <!-- 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 --> + <!-- XHED: Dialog headline for invalid QR code --> <string name="submission_qr_code_scan_invalid_dialog_headline">"Incorrect QR code"</string> - <string name="submission_qr_code_scan_invalid_dialog_body">"It appears that an incorrect QR code was scanned."</string> + <!-- YTXT: Dialog Body text for invalid QR code --> + <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">"Please try again."</string> + <!-- XBUT: Dialog(Invalid QR code) - negative button (left) --> <string name="submission_qr_code_scan_invalid_dialog_button_negative">"Cancel"</string> <!-- QR Code Scan Screen --> @@ -572,19 +671,37 @@ <!-- 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">"Risk identification 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> <!-- XBUT: tracing required : OK button --> <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">"Delete the test?"</string> + <!-- YTXT: Dialog text for test removal --> + <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">"Remove"</string> + <!-- XBUT: Negative button for test removal --> + <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 positive"</string> + <!-- YTXT: Body text for test result card positive --> + <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 entry"</string> <!-- YTXT: Body text for the tan submission page --> - <string name="submission_tan_body">"Please enter the 10 characters of the TAN you were given:"</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">"Next"</string> + <!-- XACT: Submission Tan page title --> + <string name="submission_tan_accessibility_title">"TAN entry"</string> + <!-- YTXT: Error text for the tan submission page --> + <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">"Invalid entry. Please check your entry."</string> <!-- Submission Intro --> <!-- XHED: Page title for menu at the start of the submission process --> @@ -592,9 +709,20 @@ <!-- 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 have tested positive. Since only encrypted random IDs are exchanged, you remain anonymous. You can now proceed as follows:\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. Since 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 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">"Have you been tested? This is how the Corona-Warn-App works"</string> + <!-- Notification --> <!-- XHED: Dialog headline for result dialog --> @@ -612,8 +740,8 @@ <!-- 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">"Data Privacy"</string> - <string name="submission_dispatcher_qr_privacy_dialog_body">@string/lorem_ipsum</string> + <string name="submission_dispatcher_qr_privacy_dialog_headline">"Declaration of Consent"</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">"Allow"</string> <!-- XBUT: submission(dispatcher QR Dialog) - negative button (left) --> @@ -626,18 +754,20 @@ <string name="submission_dispatcher_card_tan_tele">"Still no TAN?"</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 --> + <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">"Warning others"</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">"Please help all of us!"</string> <!-- YTXT: Body text for the positive result additional warning page--> - <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> + <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">"Data Protection"</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">"Yes, I consent to the use of my tracing function in my Corona-Warn-App. In doing so, I would Iike to make an important contribution to helping break infection chains, and containing the spread of corona virus in Germany. With exposure logging, contacts can be traced in order to identify contacts that are later diagnosed with COVID-19.\n\nI can revoke my consent at any time with effect for the future.\nFor more information, see the data protection notes."</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 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> <!-- XBUT: other warning continue button --> <string name="submission_positive_other_warning_button">"Next"</string> <!-- XHED: Dialog title for positive other warning dialog --> @@ -660,17 +790,24 @@ <!-- YTXT: Body text for completed submission page --> <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">"Please remember:"</string> + <string name="submission_done_subtitle">"Please note:"</string> <!-- YTXT: text after submission: contagious --> <string name="submission_done_contagious">"You are infectious."</string> <!-- YTXT: text after submission: isolate --> <string name="submission_done_isolate">"Please isolate yourself from other people."</string> <!-- XHED: Title for further info --> <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>"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">"Done"</string> <!-- XACT: submission finished - illustration description, explanation image --> - <string name="submission_done_illustration_description">"The diverse group of people are all cheering because someone has shared their test result."</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 --> @@ -678,18 +815,28 @@ <!-- XHED: Page headline for contact page in submission flow --> <string name="submission_contact_headline">"How this works:"</string> <!-- YTXT: Body text for contact page in submission flow--> - <string name="submission_contact_body">"We can tell you your TAN code by telephone."</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">"Call"</string> <!-- XBUT: submission contact enter tan button --> <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">"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_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> + <!-- 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 2 --> + <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 --> @@ -700,6 +847,12 @@ <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">"Your result is available"</string> + <!-- 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> + <!-- 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 --> @@ -709,21 +862,23 @@ <!-- 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 --> - <string name="submission_status_card_body_positive">"You have been tested positive for SARS-CoV-2."</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">"You have been tested negative for SARS-CoV-2."</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">"Notify and Help"</string> <!-- XBUT: submission status card show results button --> - <string name="submission_status_card_button_show_results">"Display Result"</string> + <string name="submission_status_card_button_show_results">"Display Test"</string> <!-- XHED: submission status card positive result title --> <string name="submission_status_card_positive_result_title">"Positive Result"</string> <!-- XHED: submission status card positive result subtitle --> - <string name="submission_status_card_positive_result_subtitle">"Please Note:"</string> + <string name="submission_status_card_positive_result_subtitle">"Please note:"</string> <!-- XBUT: submission status card show positive result button --> <string name="submission_status_card_positive_result_show_button">"Display Test Result"</string> <!-- YTXT: text for contagious card --> - <string name="submission_status_card_positive_result_contagious">@string/submission_done_contagious</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">"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">"Share your random IDs so that others can be warned."</string> @@ -741,17 +896,43 @@ <string name="test_result_card_status_invalid">"Evaluation is not possible"</string> <!-- YTXT: pending status text --> <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">"Other information:"</string> + <!-- YTXT: Content for further info of test result negative --> + <string-array name="test_result_card_negative_further_info_bullet_points"> + <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> <!-- XBUT: submission result dialog close button --> <string name="submission_result_button_dialog_close">"OK"</string> + + <!-- #################################### + Button Tooltips for Accessibility + ###################################### --> + <!-- XACT: back button--> + <string name="button_back">"Back to previous page"</string> + <!-- XACT: proceed button--> + <string name="button_proceed">"Continue Button"</string> + <!-- XACT: share button--> + <string name="button_share">"Share"</string> + <!-- XACT: menu button--> + <string name="button_menu">"Menu"</string> + <!-- #################################### Generic Error Messages ###################################### --> + <!-- XHED: error dialog - headline --> <string name="errors_generic_headline">"Something went wrong."</string> + <!-- XTXT: error dialog - short text for error reason --> <string name="errors_generic_details_headline">"Cause"</string> + <!-- XBUT: error dialog - button close --> <string name="errors_generic_button_positive">"OK"</string> + <!-- XBUT: error dialog - button show details --> <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">"An unknown error occurred."</string> <!-- #################################### diff --git a/Corona-Warn-App/src/main/res/values-v28/styles.xml b/Corona-Warn-App/src/main/res/values-v28/styles.xml new file mode 100644 index 0000000000000000000000000000000000000000..b3578fe4181115424801247f4ded1139a7cfede2 --- /dev/null +++ b/Corona-Warn-App/src/main/res/values-v28/styles.xml @@ -0,0 +1,33 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + + <style name="subtitle" parent="@style/TextAppearance.MaterialComponents.Subtitle1"> + <item name="android:textColor">@color/colorTextPrimary1</item> + <item name="android:lineHeight">@dimen/line_height_normal</item> + </style> + + <style name="subtitleSemanticRed" parent="@style/subtitle"> + <item name="android:textColor">@color/colorTextSemanticRed</item> + <item name="android:lineHeight">@dimen/line_height_normal</item> + </style> + + <style name="subtitleMedium" parent="@style/TextAppearance.MaterialComponents.Subtitle1"> + <item name="android:textColor">@color/colorTextPrimary2</item> + <item name="android:lineHeight">@dimen/line_height_normal</item> + </style> + + <style name="body1" parent="@style/TextAppearance.MaterialComponents.Body1"> + <item name="android:textColor">@color/colorTextPrimary1</item> + <item name="android:lineHeight">@dimen/line_height_large</item> + </style> + + <style name="body2" parent="@style/TextAppearance.MaterialComponents.Body2"> + <item name="android:textColor">@color/colorTextPrimary1</item> + <item name="android:lineHeight">@dimen/line_height_small</item> + </style> + + <style name="body2Medium" parent="@style/TextAppearance.MaterialComponents.Body2"> + <item name="android:textColor">@color/colorTextPrimary2</item> + <item name="android:lineHeight">@dimen/line_height_small</item> + </style> +</resources> \ No newline at end of file diff --git a/Corona-Warn-App/src/main/res/values/colors.xml b/Corona-Warn-App/src/main/res/values/colors.xml index 0e311ca72e888f9d9118bcecef72c7e4eedce149..afd984e0fc6493ede543e6d436393a13435bf960 100644 --- a/Corona-Warn-App/src/main/res/values/colors.xml +++ b/Corona-Warn-App/src/main/res/values/colors.xml @@ -50,7 +50,7 @@ <color name="colorStableDark">#000000</color> <color name="colorStableMedium">#4D17191A</color> <color name="colorStableLight">#FFFFFF</color> - <color name="colorStableHairlineLight">#4DFFFFFF</color> + <color name="colorStableHairlineLight">#33FFFFFF</color> <color name="colorStableHairlineDark">#3317191A</color> </resources> diff --git a/Corona-Warn-App/src/main/res/values/dimens.xml b/Corona-Warn-App/src/main/res/values/dimens.xml index 248a374e5e59856720e3833ba164428f7a717328..787274836fcc7979d9e4e705f109f175a772c3b0 100644 --- a/Corona-Warn-App/src/main/res/values/dimens.xml +++ b/Corona-Warn-App/src/main/res/values/dimens.xml @@ -17,6 +17,11 @@ <dimen name="font_button">14sp</dimen> <dimen name="font_title">20sp</dimen> + <!-- line heights --> + <dimen name="line_height_large">28sp</dimen> + <dimen name="line_height_normal">24sp</dimen> + <dimen name="line_height_small">20sp</dimen> + <dimen name="font_line_spacing_extra">4sp</dimen> <!-- header height --> @@ -32,7 +37,7 @@ <dimen name="guideline_start">@dimen/spacing_normal</dimen> <dimen name="guideline_end">@dimen/spacing_normal</dimen> <dimen name="guideline_top">@dimen/spacing_normal</dimen> - <dimen name="guideline_bottom">@dimen/spacing_normal</dimen> + <dimen name="guideline_bottom">@dimen/spacing_small</dimen> <dimen name="guideline_action">72dp</dimen> <dimen name="guideline_action_large">150dp</dimen> <dimen name="guideline_body_title">45dp</dimen> diff --git a/Corona-Warn-App/src/main/res/values/strings.xml b/Corona-Warn-App/src/main/res/values/strings.xml index 62f103e4287bca2673f8932498ba4d21764c9132..f42ee90d3c315f9d4fc595f2c3b2d53970d9e166 100644 --- a/Corona-Warn-App/src/main/res/values/strings.xml +++ b/Corona-Warn-App/src/main/res/values/strings.xml @@ -126,6 +126,14 @@ <xliff:g id="preference">preference_last_three_hours_from_server</xliff:g> </string> + <string name="preference_polling_test_result_started"> + <xliff:g id="preference">preference_polling_test_result_started</xliff:g> + </string> + + <string name="preference_test_result_notification"> + <xliff:g id="preference">preference_test_result_notification</xliff:g> + </string> + <!-- #################################### Generics ###################################### --> @@ -246,6 +254,7 @@ <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> + <!-- #################################### Main - Share ###################################### --> @@ -521,6 +530,7 @@ <string name="settings_notifications_headline_inactive">Benachrichtigungen sind ausgestellt</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 beiben möchten.</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> diff --git a/THIRD-PARTY-NOTICES b/THIRD-PARTY-NOTICES index 468f2522a0105571068f7753a12b0afd982759cd..70e2ff5c99c7c4b445dfb31ae11ca5b30912d324 100644 --- a/THIRD-PARTY-NOTICES +++ b/THIRD-PARTY-NOTICES @@ -100,6 +100,11 @@ Licensor: Google Website: https://github.com/google/protobuf-gradle-plugin License: BSD 3-Clause +Component: SQLite +Licensor: Hwaci +Website: https://www.sqlite.org/ +License: Public Domain + -------------------------------------------------------------------------------- Copyright (c) 2008-2020 Zetetic LLC All rights reserved. @@ -402,3 +407,11 @@ CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -------------------------------------------------------------------------------- +Public Domain (SQLite) + +The author disclaims copyright to this source code. In place of a legal notice, here is a blessing: + +May you do good and not evil. +May you find forgiveness for yourself and forgive others. +May you share freely, never taking more than you give. +--------------------------------------------------------------------------------