Skip to content
Snippets Groups Projects
Unverified Commit ef8e4650 authored by Jakob Möller's avatar Jakob Möller Committed by GitHub
Browse files

0.8.8 (#273)


* date formatter crash due to translation merging fixed (#271)

Co-authored-by: default avatarharambasicluka <64483219+harambasicluka@users.noreply.github.com>

* Improved UI on the QR Code scan screen (#272)

* Tests/others (#204)

* transaction tests

* transaction test fixes

Co-authored-by: default avatarJakob Möller <jakob.moeller@sap.com>
Co-authored-by: default avatarHee Tatt Ooi <hee.tatt.ooi@sap.com>
Co-authored-by: default avatarharambasicluka <64483219+harambasicluka@users.noreply.github.com>

* version bumped to 0.8.8 (#275)

Co-authored-by: default avatarFabian-K <fabian.kajzar@sap.com>
Co-authored-by: default avatarharambasicluka <64483219+harambasicluka@users.noreply.github.com>
Co-authored-by: default avatarKolya Opahle <k.opahle@sap.com>
Co-authored-by: default avatarksergeevit <64887317+ksergeevit@users.noreply.github.com>
Co-authored-by: default avatarHee Tatt Ooi <hee.tatt.ooi@sap.com>
Co-authored-by: default avataroemerb <66002424+oemerb@users.noreply.github.com>
parent 360f5812
No related branches found
No related tags found
No related merge requests found
...@@ -32,8 +32,8 @@ android { ...@@ -32,8 +32,8 @@ android {
applicationId 'de.rki.coronawarnapp' applicationId 'de.rki.coronawarnapp'
minSdkVersion 23 minSdkVersion 23
targetSdkVersion 29 targetSdkVersion 29
versionCode 14 versionCode 15
versionName "0.8.7" versionName "0.8.8"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
buildConfigField "String", "DOWNLOAD_CDN_URL", "\"$DOWNLOAD_CDN_URL\"" buildConfigField "String", "DOWNLOAD_CDN_URL", "\"$DOWNLOAD_CDN_URL\""
......
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="40dp"
android:height="40dp"
android:viewportWidth="40"
android:viewportHeight="40">
<group
android:pivotX="20"
android:pivotY="20"
android:scaleX="2"
android:scaleY="2">
<path
android:fillColor="#FFFFFF"
android:fillType="nonZero"
android:pathData="M14.2843,13l-1.2843,1.2843l5.7157,5.7157l-5.7157,5.7157l1.2843,1.2843l5.7157,-5.7157l5.7157,5.7157l1.2843,-1.2843l-5.7157,-5.7157l5.7157,-5.7157l-1.2843,-1.2843l-5.7157,5.7157z"
android:strokeWidth="1"
android:strokeColor="#00FFFFFF" />
</group>
</vector>
...@@ -21,8 +21,8 @@ ...@@ -21,8 +21,8 @@
<com.journeyapps.barcodescanner.ViewfinderView <com.journeyapps.barcodescanner.ViewfinderView
android:id="@+id/submission_qr_code_scan_viewfinder_view" android:id="@+id/submission_qr_code_scan_viewfinder_view"
android:layout_width="@dimen/submission_scan_qr_code_viewfinder_size" android:layout_width="@dimen/match_constraint"
android:layout_height="@dimen/submission_scan_qr_code_viewfinder_size" android:layout_height="@dimen/match_constraint"
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
...@@ -34,19 +34,18 @@ ...@@ -34,19 +34,18 @@
style="@style/registrationQRCodeScanBody" style="@style/registrationQRCodeScanBody"
android:layout_width="@dimen/submission_scan_qr_code_viewfinder_size" android:layout_width="@dimen/submission_scan_qr_code_viewfinder_size"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="@dimen/spacing_small" android:layout_marginTop="@dimen/submission_scan_qr_code_viewfinder_center_offset"
android:text="@string/submission_qr_code_scan_body" android:text="@string/submission_qr_code_scan_body"
app:layout_constraintEnd_toEndOf="@+id/submission_qr_code_scan_preview" app:layout_constraintEnd_toEndOf="@+id/submission_qr_code_scan_preview"
app:layout_constraintStart_toStartOf="@+id/submission_qr_code_scan_preview" app:layout_constraintStart_toStartOf="@+id/submission_qr_code_scan_preview"
app:layout_constraintTop_toBottomOf="@+id/submission_qr_code_scan_viewfinder_view" /> app:layout_constraintTop_toBottomOf="@+id/submission_qr_code_scan_guideline_center" />
<include <include
android:id="@+id/submission_qr_code_scan_close" android:id="@+id/submission_qr_code_scan_close"
layout="@layout/include_button_icon" layout="@layout/include_button_icon"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
app:icon="@{@drawable/ic_close}" app:icon="@{@drawable/ic_submission_qr_code_scan_close}"
app:layout_constraintBottom_toTopOf="@+id/submission_qr_code_scan_guideline_top" app:layout_constraintBottom_toTopOf="@+id/submission_qr_code_scan_guideline_top"
app:layout_constraintEnd_toStartOf="@+id/guideline_start" app:layout_constraintEnd_toStartOf="@+id/guideline_start"
app:layout_constraintStart_toStartOf="@+id/guideline_start" app:layout_constraintStart_toStartOf="@+id/guideline_start"
...@@ -54,10 +53,10 @@ ...@@ -54,10 +53,10 @@
<ToggleButton <ToggleButton
android:id="@+id/submission_qr_code_scan_torch" android:id="@+id/submission_qr_code_scan_torch"
android:layout_width="@dimen/icon_size" android:layout_width="@dimen/icon_size_button"
android:layout_height="@dimen/icon_size" android:layout_height="@dimen/icon_size_button"
android:background="@drawable/ic_registration_qr_code_scan_torch_toggle" android:background="@drawable/ic_registration_qr_code_scan_torch_toggle"
android:backgroundTint="@color/colorTextPrimary3" android:backgroundTint="@color/colorTextPrimary1"
android:textOff="" android:textOff=""
android:textOn="" android:textOn=""
app:layout_constraintBottom_toTopOf="@+id/submission_qr_code_scan_guideline_top" app:layout_constraintBottom_toTopOf="@+id/submission_qr_code_scan_guideline_top"
...@@ -72,6 +71,13 @@ ...@@ -72,6 +71,13 @@
android:orientation="horizontal" android:orientation="horizontal"
app:layout_constraintGuide_begin="@dimen/spacing_normal" /> app:layout_constraintGuide_begin="@dimen/spacing_normal" />
<androidx.constraintlayout.widget.Guideline
android:id="@+id/submission_qr_code_scan_guideline_center"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
app:layout_constraintGuide_percent="0.5" />
<include layout="@layout/merge_guidelines_side" /> <include layout="@layout/merge_guidelines_side" />
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>
......
...@@ -747,7 +747,7 @@ ...@@ -747,7 +747,7 @@
<!-- YTXT: virus name text --> <!-- YTXT: virus name text -->
<string name="test_result_card_virus_name_text">"SARS-CoV-2"</string> <string name="test_result_card_virus_name_text">"SARS-CoV-2"</string>
<!-- YTXT: registered at text --> <!-- YTXT: registered at text -->
<string name="test_result_card_registered_at_text">"Registriert am %tF"</string> <string name="test_result_card_registered_at_text">"Registriert am %s"</string>
<!-- YTXT: negative status text --> <!-- YTXT: negative status text -->
<string name="test_result_card_status_negative">"Negativ"</string> <string name="test_result_card_status_negative">"Negativ"</string>
<!-- YTXT: positive status text --> <!-- YTXT: positive status text -->
......
...@@ -749,7 +749,7 @@ ...@@ -749,7 +749,7 @@
<!-- YTXT: virus name text --> <!-- YTXT: virus name text -->
<string name="test_result_card_virus_name_text">"SARS-CoV-2"</string> <string name="test_result_card_virus_name_text">"SARS-CoV-2"</string>
<!-- YTXT: registered at text --> <!-- YTXT: registered at text -->
<string name="test_result_card_registered_at_text">"Registered on %tF"</string> <string name="test_result_card_registered_at_text">"Registered on %s"</string>
<!-- YTXT: negative status text --> <!-- YTXT: negative status text -->
<string name="test_result_card_status_negative">"Negative"</string> <string name="test_result_card_status_negative">"Negative"</string>
<!-- YTXT: positive status text --> <!-- YTXT: positive status text -->
......
...@@ -86,4 +86,5 @@ ...@@ -86,4 +86,5 @@
<!-- Submission QR Code Scan --> <!-- Submission QR Code Scan -->
<dimen name="submission_scan_qr_code_viewfinder_size">240dp</dimen> <dimen name="submission_scan_qr_code_viewfinder_size">240dp</dimen>
<dimen name="submission_scan_qr_code_viewfinder_center_offset">120dp</dimen>
</resources> </resources>
package de.rki.coronawarnapp.transaction
import com.google.android.gms.nearby.exposurenotification.ExposureConfiguration
import de.rki.coronawarnapp.nearby.InternalExposureNotificationClient
import de.rki.coronawarnapp.service.applicationconfiguration.ApplicationConfigurationService
import de.rki.coronawarnapp.storage.LocalData
import io.mockk.Runs
import io.mockk.coEvery
import io.mockk.coVerifyOrder
import io.mockk.every
import io.mockk.just
import io.mockk.mockk
import io.mockk.mockkObject
import io.mockk.unmockkAll
import kotlinx.coroutines.runBlocking
import org.junit.After
import org.junit.Before
import org.junit.Test
import java.io.File
import java.nio.file.Paths
import java.util.Date
/**
* RetrieveDiagnosisKeysTransaction test.
*/
class RetrieveDiagnosisKeysTransactionTest {
@Before
fun setUp() {
mockkObject(InternalExposureNotificationClient)
mockkObject(ApplicationConfigurationService)
mockkObject(RetrieveDiagnosisKeysTransaction)
mockkObject(LocalData)
coEvery { InternalExposureNotificationClient.asyncIsEnabled() } returns true
coEvery { InternalExposureNotificationClient.asyncProvideDiagnosisKeys(any(), any(), any()) } returns mockk()
coEvery { ApplicationConfigurationService.asyncRetrieveExposureConfiguration() } returns mockk()
every { LocalData.googleApiToken(any()) } just Runs
every { LocalData.lastTimeDiagnosisKeysFromServerFetch() } returns Date()
every { LocalData.lastTimeDiagnosisKeysFromServerFetch(any()) } just Runs
}
@Test
fun testTransactionNoFiles() {
coEvery { RetrieveDiagnosisKeysTransaction["executeFetchKeyFilesFromServer"](any<Date>()) } returns listOf<File>()
runBlocking {
RetrieveDiagnosisKeysTransaction.start()
coVerifyOrder {
RetrieveDiagnosisKeysTransaction["executeSetup"]()
RetrieveDiagnosisKeysTransaction["executeRetrieveRiskScoreParams"]()
RetrieveDiagnosisKeysTransaction["executeFetchKeyFilesFromServer"](any<Date>())
RetrieveDiagnosisKeysTransaction["executeFetchDateUpdate"](any<Date>())
}
}
}
@Test
fun testTransactionHasFiles() {
val file = Paths.get("src", "test", "resources", "keys.bin").toFile()
coEvery { RetrieveDiagnosisKeysTransaction["executeFetchKeyFilesFromServer"](any<Date>()) } returns listOf(file)
runBlocking {
RetrieveDiagnosisKeysTransaction.start()
coVerifyOrder {
RetrieveDiagnosisKeysTransaction["executeSetup"]()
RetrieveDiagnosisKeysTransaction["executeRetrieveRiskScoreParams"]()
RetrieveDiagnosisKeysTransaction["executeFetchKeyFilesFromServer"](any<Date>())
RetrieveDiagnosisKeysTransaction["executeAPISubmission"](any<String>(), listOf(file), any<ExposureConfiguration>())
RetrieveDiagnosisKeysTransaction["executeFetchDateUpdate"](any<Date>())
}
}
}
@After
fun cleanUp() {
unmockkAll()
}
}
package de.rki.coronawarnapp.transaction
import com.google.android.gms.nearby.exposurenotification.TemporaryExposureKey
import de.rki.coronawarnapp.nearby.InternalExposureNotificationClient
import de.rki.coronawarnapp.service.diagnosiskey.DiagnosisKeyService
import de.rki.coronawarnapp.service.submission.SubmissionService
import de.rki.coronawarnapp.storage.LocalData
import io.mockk.Runs
import io.mockk.coEvery
import io.mockk.coVerifyOrder
import io.mockk.every
import io.mockk.just
import io.mockk.mockkObject
import io.mockk.slot
import io.mockk.unmockkAll
import kotlinx.coroutines.runBlocking
import org.hamcrest.CoreMatchers.`is`
import org.hamcrest.MatcherAssert.assertThat
import org.junit.After
import org.junit.Before
import org.junit.Test
class SubmitDiagnosisKeysTransactionTest {
private val authString = "authString"
@Before
fun setUp() {
mockkObject(LocalData)
mockkObject(SubmissionService)
mockkObject(InternalExposureNotificationClient)
mockkObject(DiagnosisKeyService)
every { LocalData.numberOfSuccessfulSubmissions(any()) } just Runs
coEvery { SubmissionService.asyncRequestAuthCode(any()) } returns authString
}
@Test
fun testTransactionNoKeys() {
coEvery { InternalExposureNotificationClient.asyncGetTemporaryExposureKeyHistory() } returns listOf()
coEvery { DiagnosisKeyService.asyncSubmitKeys(authString, listOf()) } just Runs
runBlocking {
SubmitDiagnosisKeysTransaction.start("123")
coVerifyOrder {
DiagnosisKeyService.asyncSubmitKeys(authString, listOf())
SubmissionService.submissionSuccessful()
}
}
}
@Test
fun testTransactionHasKeys() {
val key = TemporaryExposureKey.TemporaryExposureKeyBuilder()
.setKeyData(ByteArray(1))
.setRollingPeriod(1)
.setRollingStartIntervalNumber(1)
.setTransmissionRiskLevel(1)
.build()
val testList = slot<List<KeyExportFormat.TemporaryExposureKey>>()
coEvery { InternalExposureNotificationClient.asyncGetTemporaryExposureKeyHistory() } returns listOf(key)
coEvery { DiagnosisKeyService.asyncSubmitKeys(authString, capture(testList)) } just Runs
runBlocking {
SubmitDiagnosisKeysTransaction.start("123")
coVerifyOrder {
DiagnosisKeyService.asyncSubmitKeys(authString, any())
SubmissionService.submissionSuccessful()
}
assertThat(testList.isCaptured, `is`(true))
assertThat(testList.captured.size, `is`(1))
}
}
@After
fun cleanUp() {
unmockkAll()
}
}
File added
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment