Skip to content

Commit

Permalink
*[FakeReport] Implemented random fake infection reports
Browse files Browse the repository at this point in the history
  • Loading branch information
avecina committed Sep 25, 2020
1 parent af7442e commit 91dcfff
Show file tree
Hide file tree
Showing 11 changed files with 190 additions and 82 deletions.
3 changes: 3 additions & 0 deletions app/src/main/java/es/gob/radarcovid/RadarCovidApplication.kt
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ import dagger.android.AndroidInjector
import dagger.android.support.DaggerApplication
import es.gob.radarcovid.common.base.broadcast.ExposureStatusChangeBroadcastReceiver
import es.gob.radarcovid.common.di.component.DaggerApplicationComponent
import es.gob.radarcovid.features.worker.FakeInfectionReportWorker
import io.reactivex.rxjava3.plugins.RxJavaPlugins
import okhttp3.CertificatePinner
import org.dpppt.android.sdk.DP3T
Expand Down Expand Up @@ -46,6 +47,8 @@ class RadarCovidApplication : DaggerApplication() {
DP3T.setCertificatePinner(certificatePinner)
DP3T.setUserAgent(userAgent)

FakeInfectionReportWorker.start(this)

registerReceiver(ExposureStatusChangeBroadcastReceiver(), DP3T.getUpdateIntentFilter())

}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,22 +31,19 @@ class RepositoryModule {

@Provides
@PerApplication
fun providesExposureStatusRepository(repository: ExposureStatusRepositoryImpl): ExposureStatusRepository =
fun providesFakeInfectionReportRepository(repository: FakeInfectionReportRepositoryImpl): FakeInfectionReportRepository =
repository

@Provides
@PerApplication
fun providesDomainRepository(repository: DomainRepositoryImpl): DomainRepository = repository
fun providesExposureStatusRepository(repository: ExposureStatusRepositoryImpl): ExposureStatusRepository =
repository

@Provides
@PerApplication
fun providesPreferencesRepository(repository: PreferencesRepositoryImpl): PreferencesRepository =
repository

@Provides
@PerApplication
fun providesExampleRepository(repository: ExampleRepositoryImpl): ExampleRepository = repository

@Provides
@PerApplication
fun providesApiRepository(repository: ApiRepositoryImpl): ApiRepository = repository
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,11 +14,16 @@ import dagger.Module
import dagger.android.ContributesAndroidInjector
import es.gob.radarcovid.common.base.broadcast.ExposureStatusChangeBroadcastReceiver
import es.gob.radarcovid.common.di.scope.PerService
import es.gob.radarcovid.features.worker.FakeInfectionReportWorker
import es.gob.radarcovid.features.worker.HealerWorker

@Module
abstract class ServicesModule {

@PerService
@ContributesAndroidInjector
abstract fun bindsFakeInfectedReportWorker(): FakeInfectionReportWorker

@PerService
@ContributesAndroidInjector
abstract fun bindsHealerWorker(): HealerWorker
Expand Down

This file was deleted.

This file was deleted.

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,10 @@

package es.gob.radarcovid.datamanager.repository

import es.gob.radarcovid.models.domain.ExposureInfo
import io.reactivex.rxjava3.core.Completable

interface DomainRepository {
interface FakeInfectionReportRepository {

var exposureInfo: ExposureInfo?
fun notifyFakeInfected(authCode: String): Completable

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
/*
* Copyright (c) 2020 Gobierno de España
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
*
* SPDX-License-Identifier: MPL-2.0
*/

package es.gob.radarcovid.datamanager.repository

import android.content.Context
import es.gob.radarcovid.BuildConfig
import io.reactivex.rxjava3.core.Completable
import org.dpppt.android.sdk.DP3T
import org.dpppt.android.sdk.models.ExposeeAuthMethodAuthorization
import javax.inject.Inject
import javax.inject.Named

class FakeInfectionReportRepositoryImpl @Inject constructor(
@Named("applicationContext") private val context: Context
) : FakeInfectionReportRepository {

override fun notifyFakeInfected(authCode: String): Completable =
Completable.create {
if (BuildConfig.isMock) {
it.onComplete()
} else {
DP3T.sendFakeInfectedRequest(context,
ExposeeAuthMethodAuthorization("Bearer $authCode"),
{ it.onComplete() },
{ it.onError(Exception("Error notifying fake infection")) }
)
}
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
/*
* Copyright (c) 2020 Gobierno de España
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
*
* SPDX-License-Identifier: MPL-2.0
*/

package es.gob.radarcovid.datamanager.usecase

import es.gob.radarcovid.datamanager.repository.ApiRepository
import es.gob.radarcovid.datamanager.repository.FakeInfectionReportRepository
import es.gob.radarcovid.models.request.RequestVerifyCode
import es.gob.radarcovid.models.response.ResponseToken
import io.reactivex.rxjava3.core.Completable
import io.reactivex.rxjava3.core.Observable
import javax.inject.Inject

class ReportFakeInfectionUseCase @Inject constructor(
private val fakeInfectionReportRepository: FakeInfectionReportRepository,
private val apiRepository: ApiRepository
) {

companion object {

const val FAKE_REPORT_CODE: String = "112358132134"

}


fun reportFakeInfection(): Completable =
getFakeVerifyToken().flatMapCompletable {
fakeInfectionReportRepository.notifyFakeInfected(it.token)
}.concatWith {
it.onComplete()
}

private fun getFakeVerifyToken(): Observable<ResponseToken> {
return Observable.create { emitter ->
val result = apiRepository.verifyCode(RequestVerifyCode(null, FAKE_REPORT_CODE))

if (result.isLeft()) {
emitter.onError(result.left().get())
} else {
emitter.onNext(result.right().get())
emitter.onComplete()
}

}
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ import es.gob.radarcovid.common.base.utils.JwtTokenUtils
import es.gob.radarcovid.datamanager.repository.ApiRepository
import es.gob.radarcovid.datamanager.repository.ContactTracingRepository
import es.gob.radarcovid.datamanager.repository.PreferencesRepository
import es.gob.radarcovid.models.exception.GenericRequestException
import es.gob.radarcovid.models.request.RequestVerifyCode
import es.gob.radarcovid.models.response.ResponseToken
import io.reactivex.rxjava3.core.Completable
Expand All @@ -28,17 +29,18 @@ class ReportInfectedUseCase @Inject constructor(
private val jwtTokenUtils: JwtTokenUtils
) {

fun reportInfected(reportCode: String): Completable {

return getVerifyToken(reportCode).flatMapCompletable {
contactTracingRepository.notifyInfected(it.token, jwtTokenUtils.getOnset(it.token))
}.concatWith {
preferencesRepository.setInfectionReportDate(Date())
it.onComplete()
fun reportInfected(reportCode: String): Completable =
if (reportCode == ReportFakeInfectionUseCase.FAKE_REPORT_CODE) {
Completable.create { it.onError(GenericRequestException()) }
} else {
getVerifyToken(reportCode).flatMapCompletable {
contactTracingRepository.notifyInfected(it.token, jwtTokenUtils.getOnset(it.token))
}.concatWith {
preferencesRepository.setInfectionReportDate(Date())
it.onComplete()
}
}

}

private fun getVerifyToken(reportCode: String): Observable<ResponseToken> {
return Observable.create { emitter ->
val result = apiRepository.verifyCode(RequestVerifyCode(null, reportCode))
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
/*
* Copyright (c) 2020 Gobierno de España
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
*
* SPDX-License-Identifier: MPL-2.0
*/

package es.gob.radarcovid.features.worker

import android.content.Context
import androidx.work.*
import dagger.android.HasAndroidInjector
import es.gob.radarcovid.datamanager.usecase.ReportFakeInfectionUseCase
import org.dpppt.android.sdk.BuildConfig
import org.dpppt.android.sdk.DP3T
import java.util.concurrent.TimeUnit
import javax.inject.Inject
import kotlin.random.Random

class FakeInfectionReportWorker(context: Context, workerParams: WorkerParameters) :
Worker(context, workerParams) {

init {
(context.applicationContext as? HasAndroidInjector)
?.androidInjector()
?.inject(this)
}

companion object {

private const val TAG = "FakeInfectionReportWorker"

fun start(context: Context) {
start(context, getRandomDelay(), ExistingWorkPolicy.KEEP)
}

private fun start(
context: Context,
delayInMinutes: Long,
existingWorkPolicy: ExistingWorkPolicy
) {
val constraints = Constraints.Builder()
.setRequiredNetworkType(NetworkType.CONNECTED)
.build()
val work =
OneTimeWorkRequest
.Builder(FakeInfectionReportWorker::class.java)
.setInitialDelay(delayInMinutes, TimeUnit.MINUTES)
.setConstraints(constraints)
.build()
WorkManager.getInstance(context)
.enqueueUniqueWork(TAG, existingWorkPolicy, work)
}

private fun getRandomDelay(): Long = Random.nextLong(180, 360)

}

@Inject
lateinit var reportFakeInfectionUseCase: ReportFakeInfectionUseCase

override fun doWork(): Result {
if (BuildConfig.DEBUG)
DP3T.addWorkerStartedToHistory(applicationContext, TAG)
reportFakeInfectionUseCase.reportFakeInfection().subscribe()
start(applicationContext, getRandomDelay(), ExistingWorkPolicy.APPEND)
return Result.success()
}

}

0 comments on commit 91dcfff

Please sign in to comment.