From 3897f006cee20d18b6491c37f63c7066619e15cc Mon Sep 17 00:00:00 2001 From: Matthias Urhahn <matthias.urhahn@sap.com> Date: Thu, 11 Feb 2021 12:15:40 +0100 Subject: [PATCH] Contact journal extension skeletons (EXPOSUREAPP-5105) (#2327) * Skeleton classes for new contact diary extensions. * LINTER * Adjust failing tests. * Revert changes to ContactDiary DB v1 scheme --- .../2.json | 196 ++++++++++++++++++ .../model/ContactDiaryLocation.kt | 2 + .../model/ContactDiaryLocationVisit.kt | 6 + .../contactdiary/model/ContactDiaryPerson.kt | 2 + .../model/ContactDiaryPersonEncounter.kt | 11 + .../model/DefaultContactDiaryLocation.kt | 4 +- .../model/DefaultContactDiaryLocationVisit.kt | 4 +- .../model/DefaultContactDiaryPerson.kt | 4 +- .../DefaultContactDiaryPersonEncounter.kt | 6 +- .../storage/ContactDiaryDatabase.kt | 4 +- .../entity/ContactDiaryLocationEntity.kt | 4 +- .../entity/ContactDiaryPersonEntity.kt | 4 +- .../ContactDiaryEditLocationsViewModelTest.kt | 2 + .../ContactDiaryEditPersonsViewModelTest.kt | 2 + 14 files changed, 243 insertions(+), 8 deletions(-) create mode 100644 Corona-Warn-App/schemas/de.rki.coronawarnapp.contactdiary.storage.ContactDiaryDatabase/2.json diff --git a/Corona-Warn-App/schemas/de.rki.coronawarnapp.contactdiary.storage.ContactDiaryDatabase/2.json b/Corona-Warn-App/schemas/de.rki.coronawarnapp.contactdiary.storage.ContactDiaryDatabase/2.json new file mode 100644 index 000000000..4f53fc054 --- /dev/null +++ b/Corona-Warn-App/schemas/de.rki.coronawarnapp.contactdiary.storage.ContactDiaryDatabase/2.json @@ -0,0 +1,196 @@ +{ + "formatVersion": 1, + "database": { + "version": 2, + "identityHash": "abaa3557b994e3bc2a61d8ee2edff8ba", + "entities": [ + { + "tableName": "locations", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`locationId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `locationName` TEXT NOT NULL, `phoneNumber` TEXT, `emailAddress` TEXT)", + "fields": [ + { + "fieldPath": "locationId", + "columnName": "locationId", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "locationName", + "columnName": "locationName", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "phoneNumber", + "columnName": "phoneNumber", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "emailAddress", + "columnName": "emailAddress", + "affinity": "TEXT", + "notNull": false + } + ], + "primaryKey": { + "columnNames": [ + "locationId" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "locationvisits", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `date` TEXT NOT NULL, `fkLocationId` INTEGER NOT NULL, FOREIGN KEY(`fkLocationId`) REFERENCES `locations`(`locationId`) ON UPDATE CASCADE ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED)", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "fkLocationId", + "columnName": "fkLocationId", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [ + { + "name": "index_locationvisits_fkLocationId", + "unique": false, + "columnNames": [ + "fkLocationId" + ], + "createSql": "CREATE INDEX IF NOT EXISTS `index_locationvisits_fkLocationId` ON `${TABLE_NAME}` (`fkLocationId`)" + } + ], + "foreignKeys": [ + { + "table": "locations", + "onDelete": "CASCADE", + "onUpdate": "CASCADE", + "columns": [ + "fkLocationId" + ], + "referencedColumns": [ + "locationId" + ] + } + ] + }, + { + "tableName": "persons", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`personId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `fullName` TEXT NOT NULL, `phoneNumber` TEXT, `emailAddress` TEXT)", + "fields": [ + { + "fieldPath": "personId", + "columnName": "personId", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "fullName", + "columnName": "fullName", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "phoneNumber", + "columnName": "phoneNumber", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "emailAddress", + "columnName": "emailAddress", + "affinity": "TEXT", + "notNull": false + } + ], + "primaryKey": { + "columnNames": [ + "personId" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "personencounters", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `date` TEXT NOT NULL, `fkPersonId` INTEGER NOT NULL, FOREIGN KEY(`fkPersonId`) REFERENCES `persons`(`personId`) ON UPDATE CASCADE ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED)", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "fkPersonId", + "columnName": "fkPersonId", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [ + { + "name": "index_personencounters_fkPersonId", + "unique": false, + "columnNames": [ + "fkPersonId" + ], + "createSql": "CREATE INDEX IF NOT EXISTS `index_personencounters_fkPersonId` ON `${TABLE_NAME}` (`fkPersonId`)" + } + ], + "foreignKeys": [ + { + "table": "persons", + "onDelete": "CASCADE", + "onUpdate": "CASCADE", + "columns": [ + "fkPersonId" + ], + "referencedColumns": [ + "personId" + ] + } + ] + } + ], + "views": [], + "setupQueries": [ + "CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)", + "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, 'abaa3557b994e3bc2a61d8ee2edff8ba')" + ] + } +} \ No newline at end of file diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/model/ContactDiaryLocation.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/model/ContactDiaryLocation.kt index d4192af04..1221b89bb 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/model/ContactDiaryLocation.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/model/ContactDiaryLocation.kt @@ -6,6 +6,8 @@ import java.util.Locale interface ContactDiaryLocation : HasStableId { val locationId: Long var locationName: String + val phoneNumber: String? + val emailAddress: String? } fun List<ContactDiaryLocation>.sortByNameAndIdASC(): List<ContactDiaryLocation> = diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/model/ContactDiaryLocationVisit.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/model/ContactDiaryLocationVisit.kt index 2d477bcee..2a1ec858e 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/model/ContactDiaryLocationVisit.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/model/ContactDiaryLocationVisit.kt @@ -7,6 +7,12 @@ interface ContactDiaryLocationVisit { val id: Long val date: LocalDate val contactDiaryLocation: ContactDiaryLocation + + /* + Value in miliseconds + */ + val duration: Long? + val circumstances: String? } fun List<ContactDiaryLocationVisit>.sortByNameAndIdASC(): List<ContactDiaryLocationVisit> = diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/model/ContactDiaryPerson.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/model/ContactDiaryPerson.kt index de391152b..0340fa66e 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/model/ContactDiaryPerson.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/model/ContactDiaryPerson.kt @@ -6,6 +6,8 @@ import java.util.Locale interface ContactDiaryPerson : HasStableId { val personId: Long var fullName: String + val phoneNumber: String? + val emailAddress: String? } fun List<ContactDiaryPerson>.sortByNameAndIdASC(): List<ContactDiaryPerson> = diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/model/ContactDiaryPersonEncounter.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/model/ContactDiaryPersonEncounter.kt index 47975a267..be1c173f9 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/model/ContactDiaryPersonEncounter.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/model/ContactDiaryPersonEncounter.kt @@ -7,6 +7,17 @@ interface ContactDiaryPersonEncounter { val id: Long val date: LocalDate val contactDiaryPerson: ContactDiaryPerson + val durationClassification: DurationClassification? + val withMask: Boolean? + val wasOutside: Boolean? + val circumstances: String? + + enum class DurationClassification( + val key: String + ) { + LESS_THAN_15_MINUTES("LessThan15Minutes"), + MORE_THAN_15_MINUTES("MoreThan15Minutes") + } } fun List<ContactDiaryPersonEncounter>.sortByNameAndIdASC(): List<ContactDiaryPersonEncounter> = diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/model/DefaultContactDiaryLocation.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/model/DefaultContactDiaryLocation.kt index 78ff94aa0..3c20aa3cb 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/model/DefaultContactDiaryLocation.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/model/DefaultContactDiaryLocation.kt @@ -2,7 +2,9 @@ package de.rki.coronawarnapp.contactdiary.model data class DefaultContactDiaryLocation( override val locationId: Long = 0L, - override var locationName: String + override var locationName: String, + override val phoneNumber: String? = null, + override val emailAddress: String? = null ) : ContactDiaryLocation { override val stableId: Long get() = locationId diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/model/DefaultContactDiaryLocationVisit.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/model/DefaultContactDiaryLocationVisit.kt index 0c2124a3c..46362e1d0 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/model/DefaultContactDiaryLocationVisit.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/model/DefaultContactDiaryLocationVisit.kt @@ -5,5 +5,7 @@ import org.joda.time.LocalDate data class DefaultContactDiaryLocationVisit( override val id: Long = 0L, override val date: LocalDate, - override val contactDiaryLocation: ContactDiaryLocation + override val contactDiaryLocation: ContactDiaryLocation, + override val duration: Long? = null, + override val circumstances: String? = null ) : ContactDiaryLocationVisit diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/model/DefaultContactDiaryPerson.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/model/DefaultContactDiaryPerson.kt index 911bd939b..8827126fc 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/model/DefaultContactDiaryPerson.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/model/DefaultContactDiaryPerson.kt @@ -2,7 +2,9 @@ package de.rki.coronawarnapp.contactdiary.model data class DefaultContactDiaryPerson( override val personId: Long = 0L, - override var fullName: String + override var fullName: String, + override val phoneNumber: String? = null, + override val emailAddress: String? = null ) : ContactDiaryPerson { override val stableId: Long get() = personId diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/model/DefaultContactDiaryPersonEncounter.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/model/DefaultContactDiaryPersonEncounter.kt index bdd303ef0..149fdfe31 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/model/DefaultContactDiaryPersonEncounter.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/model/DefaultContactDiaryPersonEncounter.kt @@ -5,5 +5,9 @@ import org.joda.time.LocalDate data class DefaultContactDiaryPersonEncounter( override val id: Long = 0L, override val date: LocalDate, - override val contactDiaryPerson: ContactDiaryPerson + override val contactDiaryPerson: ContactDiaryPerson, + override val durationClassification: ContactDiaryPersonEncounter.DurationClassification? = null, + override val withMask: Boolean? = null, + override val wasOutside: Boolean? = null, + override val circumstances: String? = null ) : ContactDiaryPersonEncounter diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/storage/ContactDiaryDatabase.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/storage/ContactDiaryDatabase.kt index b80474dca..fa8e6a748 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/storage/ContactDiaryDatabase.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/storage/ContactDiaryDatabase.kt @@ -24,7 +24,7 @@ import javax.inject.Inject ContactDiaryPersonEntity::class, ContactDiaryPersonEncounterEntity::class ], - version = 1, + version = 2, // TODO check migration patterns exportSchema = true ) @TypeConverters(CommonConverters::class) @@ -38,7 +38,7 @@ abstract class ContactDiaryDatabase : RoomDatabase() { class Factory @Inject constructor(@AppContext private val ctx: Context) { fun create(): ContactDiaryDatabase = Room .databaseBuilder(ctx, ContactDiaryDatabase::class.java, CONTACT_DIARY_DATABASE_NAME) - .fallbackToDestructiveMigration() + .fallbackToDestructiveMigration() // TODO we increased schema version, need to migrate? .build() } diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/storage/entity/ContactDiaryLocationEntity.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/storage/entity/ContactDiaryLocationEntity.kt index ed36e6276..dc68c8512 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/storage/entity/ContactDiaryLocationEntity.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/storage/entity/ContactDiaryLocationEntity.kt @@ -11,7 +11,9 @@ import kotlinx.parcelize.Parcelize @Entity(tableName = "locations") data class ContactDiaryLocationEntity( @PrimaryKey(autoGenerate = true) @ColumnInfo(name = "locationId") override val locationId: Long = 0L, - @ColumnInfo(name = "locationName") override var locationName: String + @ColumnInfo(name = "locationName") override var locationName: String, + override val phoneNumber: String? = null, + override val emailAddress: String? = null ) : ContactDiaryLocation, Parcelable { override val stableId: Long get() = locationId diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/storage/entity/ContactDiaryPersonEntity.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/storage/entity/ContactDiaryPersonEntity.kt index 0d1d1738d..458988fee 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/storage/entity/ContactDiaryPersonEntity.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/storage/entity/ContactDiaryPersonEntity.kt @@ -11,7 +11,9 @@ import kotlinx.parcelize.Parcelize @Entity(tableName = "persons") data class ContactDiaryPersonEntity( @PrimaryKey(autoGenerate = true) @ColumnInfo(name = "personId") override val personId: Long = 0L, - @ColumnInfo(name = "fullName") override var fullName: String + @ColumnInfo(name = "fullName") override var fullName: String, + override val phoneNumber: String? = null, + override val emailAddress: String? = null ) : ContactDiaryPerson, Parcelable { override val stableId: Long get() = personId diff --git a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/contactdiary/ui/edit/ContactDiaryEditLocationsViewModelTest.kt b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/contactdiary/ui/edit/ContactDiaryEditLocationsViewModelTest.kt index a9022f4fe..43600cde6 100644 --- a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/contactdiary/ui/edit/ContactDiaryEditLocationsViewModelTest.kt +++ b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/contactdiary/ui/edit/ContactDiaryEditLocationsViewModelTest.kt @@ -26,6 +26,8 @@ class ContactDiaryEditLocationsViewModelTest { private val location = object : ContactDiaryLocation { override val locationId = 1L override var locationName = "Supermarket" + override val phoneNumber: String? = null + override val emailAddress: String? = null override val stableId = 1L } private val locationList = listOf(location) diff --git a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/contactdiary/ui/edit/ContactDiaryEditPersonsViewModelTest.kt b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/contactdiary/ui/edit/ContactDiaryEditPersonsViewModelTest.kt index f1a8aa1e2..f18f6ecf7 100644 --- a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/contactdiary/ui/edit/ContactDiaryEditPersonsViewModelTest.kt +++ b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/contactdiary/ui/edit/ContactDiaryEditPersonsViewModelTest.kt @@ -26,6 +26,8 @@ class ContactDiaryEditPersonsViewModelTest { private val person = object : ContactDiaryPerson { override val personId = 1L override var fullName = "Julia" + override val phoneNumber: String? = null + override val emailAddress: String? = null override val stableId = 1L } -- GitLab