From 236aefa34db44fe36f73f39f23a0390f4c4bcda5 Mon Sep 17 00:00:00 2001 From: johan12345 Date: Sun, 11 Jul 2021 15:20:34 +0200 Subject: [PATCH] fix (de)serialization of favorites --- app/build.gradle | 1 + .../evmap/api/chargeprice/ChargepriceModel.kt | 2 ++ .../evmap/api/goingelectric/GoingElectricModel.kt | 3 ++- .../evmap/api/openchargemap/OpenChargeMapModel.kt | 7 ++++--- .../java/net/vonforst/evmap/model/ChargersModel.kt | 7 +++++-- .../net/vonforst/evmap/storage/TypeConverters.kt | 14 ++++++++++++-- .../evmap/viewmodel/ChargepriceViewModel.kt | 2 +- 7 files changed, 27 insertions(+), 9 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 2ca861c4..8434b0ac 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -121,6 +121,7 @@ dependencies { implementation 'com.squareup.okhttp3:okhttp:4.9.0' implementation 'com.squareup.okhttp3:okhttp-urlconnection:4.9.0' implementation 'com.squareup.moshi:moshi-kotlin:1.12.0' + implementation 'com.squareup.moshi:moshi-adapters:1.12.0' implementation 'moe.banana:moshi-jsonapi:3.5.0' implementation 'moe.banana:moshi-jsonapi-retrofit-converter:3.5.0' implementation 'io.coil-kt:coil:1.1.0' diff --git a/app/src/main/java/net/vonforst/evmap/api/chargeprice/ChargepriceModel.kt b/app/src/main/java/net/vonforst/evmap/api/chargeprice/ChargepriceModel.kt index 161c1863..3fd9ff8c 100644 --- a/app/src/main/java/net/vonforst/evmap/api/chargeprice/ChargepriceModel.kt +++ b/app/src/main/java/net/vonforst/evmap/api/chargeprice/ChargepriceModel.kt @@ -38,6 +38,8 @@ data class ChargepriceStation( charger: ChargeLocation, compatibleConnectors: List, ): ChargepriceStation { + if (charger.chargepriceData == null) throw IllegalArgumentException() + val plugTypes = charger.chargepriceData.plugTypes ?: charger.chargepoints.map { it.type } return ChargepriceStation( diff --git a/app/src/main/java/net/vonforst/evmap/api/goingelectric/GoingElectricModel.kt b/app/src/main/java/net/vonforst/evmap/api/goingelectric/GoingElectricModel.kt index 567cafdb..f3cac986 100644 --- a/app/src/main/java/net/vonforst/evmap/api/goingelectric/GoingElectricModel.kt +++ b/app/src/main/java/net/vonforst/evmap/api/goingelectric/GoingElectricModel.kt @@ -134,7 +134,8 @@ data class GEChargerPhoto(val id: String) { } @Parcelize -private class GEChargerPhotoAdapter(override val id: String, private val apikey: String) : +@JsonClass(generateAdapter = true) +class GEChargerPhotoAdapter(override val id: String, val apikey: String) : ChargerPhoto(id) { override fun getUrl(height: Int?, width: Int?, size: Int?): String { return "https://api.goingelectric.de/chargepoints/photo/?key=${apikey}&id=$id" + diff --git a/app/src/main/java/net/vonforst/evmap/api/openchargemap/OpenChargeMapModel.kt b/app/src/main/java/net/vonforst/evmap/api/openchargemap/OpenChargeMapModel.kt index 8a8ad483..d79834cc 100644 --- a/app/src/main/java/net/vonforst/evmap/api/openchargemap/OpenChargeMapModel.kt +++ b/app/src/main/java/net/vonforst/evmap/api/openchargemap/OpenChargeMapModel.kt @@ -241,10 +241,11 @@ data class OCMStatusType( ) @Parcelize -private class OCMChargerPhotoAdapter( +@JsonClass(generateAdapter = true) +class OCMChargerPhotoAdapter( override val id: String, - private val largeUrl: String, - private val thumbUrl: String + val largeUrl: String, + val thumbUrl: String ) : ChargerPhoto(id) { override fun getUrl(height: Int?, width: Int?, size: Int?): String { val maxSize = size ?: max(height, width) diff --git a/app/src/main/java/net/vonforst/evmap/model/ChargersModel.kt b/app/src/main/java/net/vonforst/evmap/model/ChargersModel.kt index 4bfcf31d..ba74bc44 100644 --- a/app/src/main/java/net/vonforst/evmap/model/ChargersModel.kt +++ b/app/src/main/java/net/vonforst/evmap/model/ChargersModel.kt @@ -6,6 +6,7 @@ import androidx.core.text.HtmlCompat import androidx.room.Embedded import androidx.room.Entity import androidx.room.PrimaryKey +import com.squareup.moshi.JsonClass import kotlinx.parcelize.Parcelize import net.vonforst.evmap.R import net.vonforst.evmap.adapter.Equatable @@ -47,7 +48,7 @@ data class ChargeLocation( @Embedded val openinghours: OpeningHours?, @Embedded val cost: Cost?, val license: String?, - @Embedded(prefix = "chargeprice") val chargepriceData: ChargepriceData + @Embedded(prefix = "chargeprice") val chargepriceData: ChargepriceData? ) : ChargepointListItem(), Equatable, Parcelable { /** * maximum power available from this charger. @@ -279,7 +280,8 @@ data class Address( } } -@kotlinx.android.parcel.Parcelize +@Parcelize +@JsonClass(generateAdapter = true) data class Chargepoint(val type: String, val power: Double, val count: Int) : Equatable, Parcelable { fun formatPower(): String { @@ -320,6 +322,7 @@ data class ChargeCard( ) @Parcelize +@JsonClass(generateAdapter = true) data class ChargeCardId( val id: Long ) : Parcelable \ No newline at end of file diff --git a/app/src/main/java/net/vonforst/evmap/storage/TypeConverters.kt b/app/src/main/java/net/vonforst/evmap/storage/TypeConverters.kt index c7b5a5f3..f27985b9 100644 --- a/app/src/main/java/net/vonforst/evmap/storage/TypeConverters.kt +++ b/app/src/main/java/net/vonforst/evmap/storage/TypeConverters.kt @@ -3,6 +3,9 @@ package net.vonforst.evmap.storage import androidx.room.TypeConverter import com.squareup.moshi.Moshi import com.squareup.moshi.Types +import com.squareup.moshi.adapters.PolymorphicJsonAdapterFactory +import net.vonforst.evmap.api.goingelectric.GEChargerPhotoAdapter +import net.vonforst.evmap.api.openchargemap.OCMChargerPhotoAdapter import net.vonforst.evmap.model.ChargeCardId import net.vonforst.evmap.model.Chargepoint import net.vonforst.evmap.model.ChargerPhoto @@ -10,7 +13,14 @@ import java.time.Instant import java.time.LocalTime class Converters { - val moshi = Moshi.Builder().build() + val moshi = Moshi.Builder() + .add( + PolymorphicJsonAdapterFactory.of(ChargerPhoto::class.java, "type") + .withSubtype(GEChargerPhotoAdapter::class.java, "goingelectric") + .withSubtype(OCMChargerPhotoAdapter::class.java, "openchargemap") + .withDefaultValue(null) + ) + .build() private val chargepointListAdapter by lazy { val type = Types.newParameterizedType(List::class.java, Chargepoint::class.java) moshi.adapter>(type) @@ -49,7 +59,7 @@ class Converters { @TypeConverter fun toChargerPhotoList(value: String): List? { - return chargerPhotoListAdapter.fromJson(value) + return chargerPhotoListAdapter.fromJson(value)?.filterNotNull() } @TypeConverter diff --git a/app/src/main/java/net/vonforst/evmap/viewmodel/ChargepriceViewModel.kt b/app/src/main/java/net/vonforst/evmap/viewmodel/ChargepriceViewModel.kt index 24205570..7dfc47d1 100644 --- a/app/src/main/java/net/vonforst/evmap/viewmodel/ChargepriceViewModel.kt +++ b/app/src/main/java/net/vonforst/evmap/viewmodel/ChargepriceViewModel.kt @@ -153,7 +153,7 @@ class ChargepriceViewModel(application: Application, chargepriceApiKey: String) private fun getChargepricePlugType(chargepoint: Chargepoint): String { val index = charger.value!!.chargepoints.indexOf(chargepoint) - val type = charger.value!!.chargepriceData.plugTypes?.get(index) ?: chargepoint.type + val type = charger.value!!.chargepriceData!!.plugTypes?.get(index) ?: chargepoint.type return type }