From 7cc50d7127da7a49312a404884371bf2b2eb29d4 Mon Sep 17 00:00:00 2001 From: johan12345 Date: Sat, 15 Oct 2022 22:26:31 +0200 Subject: [PATCH] Upgrade jsonapi library, implement workaround for relationships --- app/build.gradle | 5 +- .../evmap/api/chargeprice/ChargepriceModel.kt | 74 ++++++++++++++++++- 2 files changed, 73 insertions(+), 6 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index d874636a..c4304081 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -171,10 +171,7 @@ dependencies { implementation 'com.squareup.okhttp3:okhttp-urlconnection:4.9.0' implementation 'com.squareup.moshi:moshi-kotlin:1.13.0' implementation 'com.squareup.moshi:moshi-adapters:1.13.0' - implementation 'com.github.johan12345:jsonapi:50d72e7e55' // patched version for jsonapi-adapters - implementation('com.markomilos.jsonapi:jsonapi-retrofit:1.0.1') { - exclude group: 'com.markomilos.jsonapi', module: 'jsonapi-adapters' - } + implementation 'com.markomilos.jsonapi:jsonapi-retrofit:1.1.0' implementation 'io.coil-kt:coil:1.1.0' implementation 'com.github.johan12345:StfalconImageViewer:5082ebd392' implementation "com.mikepenz:aboutlibraries-core:$about_libs_version" 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 bbc9868e..61ce18e4 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 @@ -1,12 +1,15 @@ package net.vonforst.evmap.api.chargeprice import android.content.Context +import android.os.Parcel import android.os.Parcelable import android.util.Patterns import com.squareup.moshi.Json import com.squareup.moshi.JsonClass import jsonapi.* +import kotlinx.parcelize.Parceler import kotlinx.parcelize.Parcelize +import kotlinx.parcelize.WriteWith import net.vonforst.evmap.R import net.vonforst.evmap.adapter.Equatable import net.vonforst.evmap.api.equivalentPlugTypes @@ -178,9 +181,12 @@ data class ChargePrice( @Json(name = "branding") val branding: ChargepriceBranding? = null, - @ToOne("tariff") - val tariffId: String? + @RelationshipsObject + val relationships: @WriteWith() Relationships? = null, ) : Equatable, Cloneable, Parcelable { + val tariffId: String? + get() = (relationships?.get("tariff") as? Relationship.ToOne)?.data?.id + fun formatMonthlyFees(ctx: Context): String { return listOfNotNull( if (totalMonthlyFee > 0) { @@ -193,6 +199,70 @@ data class ChargePrice( } } +/** + * Parceler implementation for the Relationships object. + * Note that this ignores certain fields that we don't need (links, meta, etc.) + */ +internal object RelationshipsParceler : Parceler { + override fun create(parcel: Parcel): Relationships? { + if (parcel.readInt() == 0) return null + + val nMembers = parcel.readInt() + val members = (0 until nMembers).map { _ -> + val key = parcel.readString()!! + val value = if (parcel.readInt() == 0) { + val type = parcel.readString() + val id = parcel.readString() + val ri = if (type != null && id != null) { + ResourceIdentifier(type, id) + } else null + Relationship.ToOne(ri) + } else { + val size = parcel.readInt() + val ris = (0 until size).map { _ -> + val type = parcel.readString()!! + val id = parcel.readString()!! + ResourceIdentifier(type, id) + } + Relationship.ToMany(ris) + } + key to value + }.toMap() + + return Relationships(members) + } + + override fun Relationships?.write(parcel: Parcel, flags: Int) { + if (this == null) { + parcel.writeInt(0) + return + } else { + parcel.writeInt(1) + } + + parcel.writeInt(members.size) + for (member in this.members) { + parcel.writeString(member.key) + when (val value = member.value) { + is Relationship.ToOne -> { + parcel.writeInt(0) + parcel.writeString(value.data?.type) + parcel.writeString(value.data?.id) + } + is Relationship.ToMany -> { + parcel.writeInt(1) + parcel.writeInt(value.data.size) + for (ri in value.data) { + parcel.writeString(ri.type) + parcel.writeString(ri.id) + } + } + } + } + + } +} + @JsonClass(generateAdapter = true) @Parcelize data class ChargepointPrice(