Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,7 @@ dependencies {
implementation 'androidx.core:core-ktx:1.2.0'
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
testImplementation 'junit:junit:4.13'
testImplementation "com.google.truth:truth:1.0.1"
androidTestImplementation 'androidx.test.ext:junit:1.1.1'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
implementation "androidx.navigation:navigation-fragment-ktx:$nav_version"
Expand Down Expand Up @@ -98,6 +99,7 @@ dependencies {
implementation "androidx.viewpager2:viewpager2:1.0.0"
implementation "com.google.android.material:material:1.1.0"

implementation 'com.github.TCNCoalition:tcn-client-android:0.0.3'
implementation 'com.github.TCNCoalition:tcn-client-android:0.0.4'

implementation "androidx.swiperefreshlayout:swiperefreshlayout:1.0.0"
}
8 changes: 4 additions & 4 deletions app/src/main/java/org/coepi/android/MainActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ import io.reactivex.rxkotlin.plusAssign
import org.coepi.android.R.id.rootNavHostFragment
import org.coepi.android.R.layout.activity_main
import org.coepi.android.ble.BlePreconditions
import org.coepi.android.cen.BleInitializer
import org.coepi.android.tcn.BleInitializer
import org.coepi.android.system.intent.IntentForwarder
import org.coepi.android.ui.common.UINotification
import org.coepi.android.ui.common.UINotifier
Expand All @@ -24,9 +24,9 @@ import org.koin.android.ext.android.inject
class MainActivity : AppCompatActivity() {
private val rootNav: RootNavigation by inject()
private val onboardingShower: OnboardingShower by inject()
private val cenManager: BleInitializer by inject()
private val bleInitializer: BleInitializer by inject()
private val blePreconditions: BlePreconditions by inject()
private val nonReferencedDependenciesActivator: NonReferencedDependenciesActivator by inject()
private val nonReferencedDependenciesActivator: NotReferencedDependenciesActivator by inject()
private val intentForwarder: IntentForwarder by inject()
private val uiNotifier: UINotifier by inject()

Expand All @@ -49,7 +49,7 @@ class MainActivity : AppCompatActivity() {
blePreconditions.onActivityCreated(this)

AppCenter.start(application, "0bb1bf95-3b14-48a6-a769-db1ff1df0307", Analytics::class.java, Crashes::class.java)
cenManager.start()
bleInitializer.start()
}

override fun onNewIntent(intent: Intent?) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,19 +1,19 @@
package org.coepi.android

import org.coepi.android.cross.ScannedCensHandler
import org.coepi.android.cross.ScannedTcnsHandler
import org.coepi.android.system.intent.InfectionsNotificationIntentHandler
import org.coepi.android.ui.notifications.AppNotificationChannels
import org.coepi.android.worker.cenfetcher.ContactsFetchManager
import org.coepi.android.worker.tcnfetcher.ContactsFetchManager

class NonReferencedDependenciesActivator(
scannedCensHandler: ScannedCensHandler,
class NotReferencedDependenciesActivator(
scannedTcnsHandler: ScannedTcnsHandler,
notificationChannelsInitializer: AppNotificationChannels,
contactsFetchManager: ContactsFetchManager,
infectionsNotificationIntentHandler: InfectionsNotificationIntentHandler
) {
init {
listOf(
scannedCensHandler,
scannedTcnsHandler,
notificationChannelsInitializer,
contactsFetchManager,
infectionsNotificationIntentHandler
Expand Down
15 changes: 0 additions & 15 deletions app/src/main/java/org/coepi/android/api/ApiCenReport.kt

This file was deleted.

24 changes: 0 additions & 24 deletions app/src/main/java/org/coepi/android/api/CENApi.kt

This file was deleted.

19 changes: 19 additions & 0 deletions app/src/main/java/org/coepi/android/api/TcnApi.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package org.coepi.android.api

import io.reactivex.Completable
import okhttp3.RequestBody
import retrofit2.Call
import retrofit2.http.Body
import retrofit2.http.GET
import retrofit2.http.POST
import retrofit2.http.Query

interface TcnApi {

@GET("tcnreport/")
fun getReports(@Query("intervalNumber") intervalNumber: Long,
@Query("intervalLength") intervalLength: Long): Call<List<String>>

@POST("tcnreport/")
fun postReport(@Body report: RequestBody): Completable
}

This file was deleted.

14 changes: 7 additions & 7 deletions app/src/main/java/org/coepi/android/ble/BleManagerImpl.kt
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,8 @@ import io.reactivex.subjects.PublishSubject
import io.reactivex.subjects.PublishSubject.create
import org.coepi.android.MainActivity
import org.coepi.android.R.drawable.ic_launcher_foreground
import org.coepi.android.cen.Cen
import org.coepi.android.cen.MyCenProvider
import org.coepi.android.tcn.Tcn
import org.coepi.android.domain.TcnGenerator
import org.coepi.android.system.log.LogTag.BLE
import org.coepi.android.system.log.log
import org.tcncoalition.tcnclient.bluetooth.BluetoothStateListener
Expand All @@ -32,29 +32,29 @@ import org.tcncoalition.tcnclient.bluetooth.TcnBluetoothService.LocalBinder
import org.tcncoalition.tcnclient.bluetooth.TcnBluetoothServiceCallback

interface BleManager {
val observedCens: Observable<Cen>
val observedTcns: Observable<Tcn>

fun startService()
fun stopService()
}

class BleManagerImpl(
private val app: Application,
private val myCenProvider: MyCenProvider
private val tcnGenerator: TcnGenerator
): BleManager, BluetoothStateListener {

override val observedCens: PublishSubject<Cen> = create()
override val observedTcns: PublishSubject<Tcn> = create()

private val intent get() = Intent(app, TcnBluetoothService::class.java)

private var service: TcnBluetoothService? = null

inner class BluetoothServiceCallback : TcnBluetoothServiceCallback {
override fun generateTcn(): ByteArray =
myCenProvider.generateCen().bytes
tcnGenerator.generateTcn().bytes

override fun onTcnFound(tcn: ByteArray, estimatedDistance: Double?) {
observedCens.onNext(Cen(tcn))
observedTcns.onNext(Tcn(tcn))
}
}

Expand Down
43 changes: 16 additions & 27 deletions app/src/main/java/org/coepi/android/ble/BleSimulator.kt
Original file line number Diff line number Diff line change
Expand Up @@ -2,43 +2,32 @@ package org.coepi.android.ble

import io.reactivex.Observable
import io.reactivex.Observable.fromIterable
import org.coepi.android.cen.Cen
import org.coepi.android.cen.CenKey
import org.coepi.android.domain.CenLogic
import org.coepi.android.domain.UnixTime.Companion.now
import org.coepi.android.tcn.Tcn
import org.coepi.android.extensions.base64ToByteArray
import org.coepi.android.system.log.log
import org.tcncoalition.tcnclient.crypto.SignedReport

class BleSimulator(cenLogic: CenLogic) : BleManager {
class BleSimulator : BleManager {

// Keys to test locally
private val keys: List<CenKey> = listOf(
CenKey("F2BA29936ED6898157CD839FE50ACF40998533C3A4FECFD2B9FA252E0B10E14B", now()),
CenKey("e7c63d828922422cbba7ffed3f858598d5c97ec34442ec875b74cffdf316edd6", now())
// Reports used to derive fake observed TCNs from
private val reports: List<String> = listOf(
// "LbSUvv320gtY2qTZbumxno7KJ/BDWnHuHcUH0fNv144p+K1xbPt+YQuxFHzFfo71HoegSspNJLaAz93InuQHHQEAAQAACFJtVjJaWEk9iXj1FGy+r4cmNrS84AzHzx5wS0FZJXzXFFfvqwAogt6qjIe7+6CIJ8mrFrCen3nAVrQo3Bd1jsGe6UjybRUlAA=="
"rSqWpM3ZQm7hfQ3q2x2llnFHiNhyRrUQPKEtJ33VKQcwT7Ly6e4KGaj5ZzjWt0m4c0v5n/VH5HO9UXbPXvsQTgEAQQAALFVtMVdNbHBZU1hOSlJYaDJZek5OWjJJeVdXZFpXRUozV2xoU2NHUkhWVDA9jn0pZAeME6ZBRHJOlfIikyfS0Pjg6l0txhhz6hz4exTxv8ryA3/Z26OebSRwzRfRgLdWBfohaOwOcSaynKqVCg=="
)

private val cens: List<Cen> = keys.map {
cenLogic.generateCen(it, now().value)
private val tcns: List<Tcn> = reports.mapNotNull { report ->
val signedReport = report.base64ToByteArray()?.let { SignedReport.fromByteArray(it) }
signedReport?.report?.temporaryContactNumbers?.let {
if (it.hasNext()) { it.next() } else { null }
}?.let { Tcn(it.bytes) }
}

// Emits all the cens at once and terminates
override val observedCens: Observable<Cen> = fromIterable(cens)

// Use this to emit periodically
// private var currentCenIndex = 0
// override val observedCens: Observable<Cen> =
// Observable.interval(0, 5, SECONDS)
// .subscribeOn(Schedulers.io())
// .observeOn(AndroidSchedulers.mainThread())
// .flatMap {
// if (cens.isEmpty()) {
// empty()
// } else {
// just(cens[currentCenIndex % cens.size])
// }
// }
// Emits all the TCNs at once and terminates
override val observedTcns: Observable<Tcn> = fromIterable(tcns)

init {
log.i("Using Bluetooth simulator")
log.i("Bluetooth simulator TCNs: $tcns")
}

override fun startService() {}
Expand Down
9 changes: 0 additions & 9 deletions app/src/main/java/org/coepi/android/ble/Uuids.kt

This file was deleted.

34 changes: 0 additions & 34 deletions app/src/main/java/org/coepi/android/cen/ApiModule.kt

This file was deleted.

23 changes: 0 additions & 23 deletions app/src/main/java/org/coepi/android/cen/CENModule.kt

This file was deleted.

10 changes: 0 additions & 10 deletions app/src/main/java/org/coepi/android/cen/CenDao.kt

This file was deleted.

6 changes: 0 additions & 6 deletions app/src/main/java/org/coepi/android/cen/CenKeyDao.kt

This file was deleted.

2 changes: 0 additions & 2 deletions app/src/main/java/org/coepi/android/cen/CenRepoNew.kt

This file was deleted.

11 changes: 0 additions & 11 deletions app/src/main/java/org/coepi/android/cen/CenReportDao.kt

This file was deleted.

38 changes: 0 additions & 38 deletions app/src/main/java/org/coepi/android/cen/CenReportRepo.kt

This file was deleted.

Loading