Skip to content
Snippets Groups Projects
Unverified Commit 7c3e4892 authored by Matthias Urhahn's avatar Matthias Urhahn Committed by GitHub
Browse files

Skeletons for new test result architecture (EXPOSUREAPP-6007) (#2818)

* Skeletons for new test result architecture, Draft1

* Add missing property.

* Fix LINTs

* Address PR comments.
parent e05f14ae
No related branches found
No related tags found
No related merge requests found
Showing
with 204 additions and 0 deletions
package de.rki.coronawarnapp.coronatest
import dagger.Module
@Module
class CoronaTestModule
package de.rki.coronawarnapp.coronatest
import de.rki.coronawarnapp.coronatest.qrcode.CoronaTestGUID
import de.rki.coronawarnapp.coronatest.qrcode.CoronaTestQRCode
import de.rki.coronawarnapp.coronatest.server.CoronaTestServer
import de.rki.coronawarnapp.coronatest.storage.CoronaTestStorage
import de.rki.coronawarnapp.coronatest.type.CoronaTest
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.emptyFlow
import timber.log.Timber
import javax.inject.Inject
import javax.inject.Singleton
@Singleton
class CoronaTestRepository @Inject constructor(
private val storage: CoronaTestStorage,
private val server: CoronaTestServer,
) {
val coronaTests: Flow<Set<CoronaTest>> = emptyFlow()
/**
* When this returns and there was no exception, the test was registered and a valid registrationToken obtained.
* Your new test should be available via **coronaTests**.
*/
suspend fun registerTest(request: CoronaTestQRCode) {
Timber.tag(TAG).i("registerTest(request=%s)", request)
}
suspend fun removeTest(guid: CoronaTestGUID): CoronaTest {
Timber.tag(TAG).i("removeTest(guid=%s)", guid)
throw NotImplementedError()
}
suspend fun markAsSubmitted(guid: CoronaTestGUID) {
Timber.tag(TAG).i("markAsSubmitted(guid=%s)", guid)
}
/**
* Passing **null** will refresh all test types.
*/
fun refresh(type: CoronaTest.Type? = null) {
Timber.tag(TAG).d("refresh(type=%s)", type)
}
companion object {
const val TAG = "CoronaTestRepo"
}
}
package de.rki.coronawarnapp.coronatest.qrcode
import android.os.Parcelable
import de.rki.coronawarnapp.coronatest.type.CoronaTest
import kotlinx.parcelize.Parcelize
import org.joda.time.Instant
sealed class CoronaTestQRCode : Parcelable {
abstract val type: CoronaTest.Type
abstract val guid: CoronaTestGUID
@Parcelize
data class PCR(
override val type: CoronaTest.Type,
override val guid: CoronaTestGUID,
) : CoronaTestQRCode()
@Parcelize
data class RapidAntigen(
override val type: CoronaTest.Type,
override val guid: CoronaTestGUID,
val createdAt: Instant,
val firstName: String?,
val lastName: String?,
val dateOfBirth: String?,
) : CoronaTestQRCode()
}
typealias CoronaTestGUID = String
package de.rki.coronawarnapp.coronatest.qrcode
import dagger.Reusable
import javax.inject.Inject
@Reusable
class CoronaTestQRCodeValidation @Inject constructor() {
suspend fun validate(qrCode: String): CoronaTestQRCode {
throw NotImplementedError()
}
}
package de.rki.coronawarnapp.coronatest.server
import dagger.Reusable
import javax.inject.Inject
@Reusable
class CoronaTestServer @Inject constructor()
package de.rki.coronawarnapp.coronatest.storage
import de.rki.coronawarnapp.coronatest.type.CoronaTest
import timber.log.Timber
import javax.inject.Inject
import javax.inject.Singleton
@Singleton
class CoronaTestStorage @Inject constructor() {
suspend fun load(): Set<CoronaTest> {
Timber.tag(TAG).d("load()")
throw NotImplementedError()
}
suspend fun save(tests: Set<CoronaTest>) {
Timber.tag(TAG).d("save(tests=%s)", tests)
}
companion object {
private const val TAG = "CoronaTestStorage"
}
}
package de.rki.coronawarnapp.coronatest.type
import com.google.gson.annotations.SerializedName
import de.rki.coronawarnapp.coronatest.qrcode.CoronaTestGUID
interface CoronaTest {
val testGUID: CoronaTestGUID
val registrationToken: RegistrationToken
val type: Type
val isRefreshing: Boolean
val isSubmissionAllowed: Boolean
val isSubmitted: Boolean
enum class Type {
@SerializedName("PCR")
PCR,
@SerializedName("RAPID_ANTIGEN")
RAPID_ANTIGEN,
}
}
typealias RegistrationToken = String
package de.rki.coronawarnapp.coronatest.type.antigen
import de.rki.coronawarnapp.coronatest.qrcode.CoronaTestGUID
import de.rki.coronawarnapp.coronatest.type.CoronaTest
import de.rki.coronawarnapp.coronatest.type.RegistrationToken
data class RapidAntigenCoronaTest(
override val testGUID: CoronaTestGUID,
override val registrationToken: RegistrationToken,
override val isRefreshing: Boolean,
override val isSubmissionAllowed: Boolean,
override val isSubmitted: Boolean,
val state: State,
) : CoronaTest {
override val type: CoronaTest.Type = CoronaTest.Type.RAPID_ANTIGEN
enum class State {
PENDING,
INVALID,
POSITIVE,
NEGATIVE,
REDEEMED,
OUTDATED,
}
}
package de.rki.coronawarnapp.coronatest.type.pcr
import de.rki.coronawarnapp.coronatest.qrcode.CoronaTestGUID
import de.rki.coronawarnapp.coronatest.type.CoronaTest
import de.rki.coronawarnapp.coronatest.type.RegistrationToken
data class PCRCoronaTest(
override val testGUID: CoronaTestGUID,
override val registrationToken: RegistrationToken,
override val isRefreshing: Boolean,
override val isSubmissionAllowed: Boolean,
override val isSubmitted: Boolean,
val state: State,
) : CoronaTest {
override val type: CoronaTest.Type = CoronaTest.Type.PCR
enum class State {
PENDING,
INVALID,
POSITIVE,
NEGATIVE,
REDEEMED,
}
}
...@@ -11,6 +11,7 @@ import de.rki.coronawarnapp.bugreporting.BugReporter ...@@ -11,6 +11,7 @@ import de.rki.coronawarnapp.bugreporting.BugReporter
import de.rki.coronawarnapp.bugreporting.BugReportingModule import de.rki.coronawarnapp.bugreporting.BugReportingModule
import de.rki.coronawarnapp.bugreporting.BugReportingSharedModule import de.rki.coronawarnapp.bugreporting.BugReportingSharedModule
import de.rki.coronawarnapp.bugreporting.debuglog.DebugLogger import de.rki.coronawarnapp.bugreporting.debuglog.DebugLogger
import de.rki.coronawarnapp.coronatest.CoronaTestModule
import de.rki.coronawarnapp.datadonation.DataDonationModule import de.rki.coronawarnapp.datadonation.DataDonationModule
import de.rki.coronawarnapp.diagnosiskeys.DiagnosisKeysModule import de.rki.coronawarnapp.diagnosiskeys.DiagnosisKeysModule
import de.rki.coronawarnapp.diagnosiskeys.DownloadDiagnosisKeysTaskModule import de.rki.coronawarnapp.diagnosiskeys.DownloadDiagnosisKeysTaskModule
...@@ -77,6 +78,7 @@ import javax.inject.Singleton ...@@ -77,6 +78,7 @@ import javax.inject.Singleton
DataDonationModule::class, DataDonationModule::class,
SecurityModule::class, SecurityModule::class,
EventRegistrationModule::class, EventRegistrationModule::class,
CoronaTestModule::class,
] ]
) )
interface ApplicationComponent : AndroidInjector<CoronaWarnApplication> { interface ApplicationComponent : AndroidInjector<CoronaWarnApplication> {
......
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