Author: Adam Evyčędo <git@apiote.xyz>
use new API responses
%!v(PANIC=String method: strings: negative Repeat count)
diff --git a/app/src/main/java/xyz/apiote/bimba/czwek/api/Api.kt b/app/src/main/java/xyz/apiote/bimba/czwek/api/Api.kt index ba9efd50df8b04de0fb4a5e27527cd044edd1128..15a4a583b9d23aa11b462da94c9be81ebbb69500 100644 --- a/app/src/main/java/xyz/apiote/bimba/czwek/api/Api.kt +++ b/app/src/main/java/xyz/apiote/bimba/czwek/api/Api.kt @@ -81,7 +81,7 @@ "queryables", null, params, context, - arrayOf(1u, 2u, 3u), + arrayOf(1u, 2u, 3u, 4u), null ) } @@ -93,7 +93,7 @@ "queryables", null, mapOf("near" to near.toString()), context, - arrayOf(1u, 2u, 3u), + arrayOf(1u, 2u, 3u, 4u), null ) } @@ -112,14 +112,20 @@ null ) } -suspend fun getLine(context: Context, server: Server, feedID: String, lineName: String, lineID: String): Result { +suspend fun getLine( + context: Context, + server: Server, + feedID: String, + lineName: String, + lineID: String +): Result { return request( server, "lines", lineName, mapOf("lineID" to lineID), context, - arrayOf(1u, 2u, 0u), + arrayOf(1u, 2u, 3u), feedID ) } @@ -149,7 +155,7 @@ "departures", null, params, context, - arrayOf(1u, 2u, 3u, 0u), + arrayOf(1u, 2u, 3u, 4u), feedID ) } @@ -181,7 +187,10 @@ return Result(null, Error(0, R.string.error_offline, R.drawable.error_net)) } return withContext(Dispatchers.IO) { val c = (url.openConnection() as HttpURLConnection).apply { - setRequestProperty("User-Agent", "${context.getString(R.string.applicationId)}/${context.getString(R.string.versionName)} (${Build.VERSION.SDK_INT})") + setRequestProperty( + "User-Agent", + "${context.getString(R.string.applicationId)}/${context.getString(R.string.versionName)} (${Build.VERSION.SDK_INT})" + ) setRequestProperty("X-Bimba-Token", server.token) responseVersion.forEach { addRequestProperty("Accept", "application/$it+bare") } } diff --git a/app/src/main/java/xyz/apiote/bimba/czwek/api/responses/Departures.kt b/app/src/main/java/xyz/apiote/bimba/czwek/api/responses/Departures.kt index 555cb33adfec50567f8005252d881f371a6a6e93..4e22e00b1b8365b32fc365f86c904dd74366651c 100644 --- a/app/src/main/java/xyz/apiote/bimba/czwek/api/responses/Departures.kt +++ b/app/src/main/java/xyz/apiote/bimba/czwek/api/responses/Departures.kt @@ -8,6 +8,7 @@ import xyz.apiote.bimba.czwek.api.AlertV1 import xyz.apiote.bimba.czwek.api.DepartureV1 import xyz.apiote.bimba.czwek.api.DepartureV2 import xyz.apiote.bimba.czwek.api.DepartureV3 +import xyz.apiote.bimba.czwek.api.DepartureV4 import xyz.apiote.bimba.czwek.api.StopV1 import xyz.apiote.bimba.czwek.api.StopV2 import xyz.apiote.fruchtfleisch.Reader @@ -22,8 +23,36 @@ 0UL -> DeparturesResponseDev.unmarshal(stream) 1UL -> DeparturesResponseV1.unmarshal(stream) 2UL -> DeparturesResponseV2.unmarshal(stream) 3UL -> DeparturesResponseV3.unmarshal(stream) + 4UL -> DeparturesResponseV4.unmarshal(stream) else -> throw UnknownResponseVersion("Departures", v) } + } + } +} + +data class DeparturesResponseV4( + val alerts: List<AlertV1>, + val departures: List<DepartureV4>, + val stop: StopV2 +) : DeparturesResponse { + companion object { + fun unmarshal(stream: InputStream): DeparturesResponseV4 { + val alerts = mutableListOf<AlertV1>() + val departures = mutableListOf<DepartureV4>() + + val reader = Reader(stream) + val alertsNum = reader.readUInt().toULong() + for (i in 0UL until alertsNum) { + val alert = AlertV1.unmarshal(stream) + alerts.add(alert) + } + val departuresNum = reader.readUInt().toULong() + for (i in 0UL until departuresNum) { + val departure = DepartureV4.unmarshal(stream) + departures.add(departure) + } + + return DeparturesResponseV4(alerts, departures, StopV2.unmarshal(stream)) } } } diff --git a/app/src/main/java/xyz/apiote/bimba/czwek/api/responses/Line.kt b/app/src/main/java/xyz/apiote/bimba/czwek/api/responses/Line.kt index 4709bbeb29ee0695d003bad281f553e0910dfb72..6094e3eb5fdd7a3e70ba3579dc5bb2e44a75a0a6 100644 --- a/app/src/main/java/xyz/apiote/bimba/czwek/api/responses/Line.kt +++ b/app/src/main/java/xyz/apiote/bimba/czwek/api/responses/Line.kt @@ -6,6 +6,7 @@ package xyz.apiote.bimba.czwek.api.responses import xyz.apiote.bimba.czwek.api.LineV1 import xyz.apiote.bimba.czwek.api.LineV2 +import xyz.apiote.bimba.czwek.api.LineV3 import xyz.apiote.fruchtfleisch.Reader import java.io.InputStream @@ -17,8 +18,19 @@ return when (val v = reader.readUInt().toULong()) { 0UL -> LineResponseDev.unmarshal(stream) 1UL -> LineResponseV1.unmarshal(stream) 2UL -> LineResponseV2.unmarshal(stream) + 3UL -> LineResponseV3.unmarshal(stream) else -> throw UnknownResponseVersion("Line", v) } + } + } +} + +data class LineResponseV3( + val line: LineV3 +) : LineResponse { + companion object { + fun unmarshal(stream: InputStream): LineResponseV3 { + return LineResponseV3(LineV3.unmarshal(stream)) } } } diff --git a/app/src/main/java/xyz/apiote/bimba/czwek/api/responses/Queryables.kt b/app/src/main/java/xyz/apiote/bimba/czwek/api/responses/Queryables.kt index e63b0b8f3bb35db7db30dcf3e60e0261b2bfa4c0..216ab34e80475121dde939626338c14e59e382cb 100644 --- a/app/src/main/java/xyz/apiote/bimba/czwek/api/responses/Queryables.kt +++ b/app/src/main/java/xyz/apiote/bimba/czwek/api/responses/Queryables.kt @@ -6,9 +6,11 @@ package xyz.apiote.bimba.czwek.api.responses import xyz.apiote.bimba.czwek.api.LineV1 import xyz.apiote.bimba.czwek.api.LineV2 +import xyz.apiote.bimba.czwek.api.LineV3 import xyz.apiote.bimba.czwek.api.QueryableV1 import xyz.apiote.bimba.czwek.api.QueryableV2 import xyz.apiote.bimba.czwek.api.QueryableV3 +import xyz.apiote.bimba.czwek.api.QueryableV4 import xyz.apiote.bimba.czwek.api.StopV1 import xyz.apiote.bimba.czwek.api.StopV2 import xyz.apiote.bimba.czwek.api.UnknownResourceVersionException @@ -24,8 +26,35 @@ 0UL -> QueryablesResponseDev.unmarshal(stream) 1UL -> QueryablesResponseV1.unmarshal(stream) 2UL -> QueryablesResponseV2.unmarshal(stream) 3UL -> QueryablesResponseV3.unmarshal(stream) + 4UL -> QueryablesResponseV4.unmarshal(stream) else -> throw UnknownResponseVersion("Queryables", v) } + } + } +} + +data class QueryablesResponseV4(val queryables: List<QueryableV4>) : QueryablesResponse { + companion object { + fun unmarshal(stream: InputStream): QueryablesResponseV4 { + val queryables = mutableListOf<QueryableV4>() + val reader = Reader(stream) + val n = reader.readUInt().toULong() + for (i in 0UL until n) { + when (val r = reader.readUInt().toULong()) { + 0UL -> { + queryables.add(StopV2.unmarshal(stream)) + } + + 1UL -> { + queryables.add(LineV3.unmarshal(stream)) + } + + else -> { + throw UnknownResourceVersionException("Queryable/$r", 0u) + } + } + } + return QueryablesResponseV4(queryables) } } } diff --git a/app/src/main/java/xyz/apiote/bimba/czwek/repo/OnlineRepository.kt b/app/src/main/java/xyz/apiote/bimba/czwek/repo/OnlineRepository.kt index c5c8c19ce7fb30d5b55e0f06b7ba572f2df4dedf..28a2769f3f25f94b3ef2ed695f4d5ac08b528eb8 100644 --- a/app/src/main/java/xyz/apiote/bimba/czwek/repo/OnlineRepository.kt +++ b/app/src/main/java/xyz/apiote/bimba/czwek/repo/OnlineRepository.kt @@ -23,6 +23,7 @@ import xyz.apiote.bimba.czwek.api.responses.DeparturesResponseDev import xyz.apiote.bimba.czwek.api.responses.DeparturesResponseV1 import xyz.apiote.bimba.czwek.api.responses.DeparturesResponseV2 import xyz.apiote.bimba.czwek.api.responses.DeparturesResponseV3 +import xyz.apiote.bimba.czwek.api.responses.DeparturesResponseV4 import xyz.apiote.bimba.czwek.api.responses.ErrorResponse import xyz.apiote.bimba.czwek.api.responses.FeedsResponse import xyz.apiote.bimba.czwek.api.responses.FeedsResponseDev @@ -32,6 +33,7 @@ import xyz.apiote.bimba.czwek.api.responses.LineResponse import xyz.apiote.bimba.czwek.api.responses.LineResponseDev import xyz.apiote.bimba.czwek.api.responses.LineResponseV1 import xyz.apiote.bimba.czwek.api.responses.LineResponseV2 +import xyz.apiote.bimba.czwek.api.responses.LineResponseV3 import xyz.apiote.bimba.czwek.api.responses.LocatablesResponse import xyz.apiote.bimba.czwek.api.responses.LocatablesResponseDev import xyz.apiote.bimba.czwek.api.responses.LocatablesResponseV1 @@ -42,6 +44,7 @@ import xyz.apiote.bimba.czwek.api.responses.QueryablesResponseDev import xyz.apiote.bimba.czwek.api.responses.QueryablesResponseV1 import xyz.apiote.bimba.czwek.api.responses.QueryablesResponseV2 import xyz.apiote.bimba.czwek.api.responses.QueryablesResponseV3 +import xyz.apiote.bimba.czwek.api.responses.QueryablesResponseV4 import java.io.File import java.net.URLEncoder import java.time.LocalDate @@ -92,7 +95,15 @@ context: Context, limit: Int? ): StopDepartures? { val result = - xyz.apiote.bimba.czwek.api.getDepartures(context, Server.get(context), feedID, stop, date, line, limit) + xyz.apiote.bimba.czwek.api.getDepartures( + context, + Server.get(context), + feedID, + stop, + date, + line, + limit + ) if (result.error != null) { if (result.stream != null) { val response = withContext(Dispatchers.IO) { ErrorResponse.unmarshal(result.stream) } @@ -104,6 +115,11 @@ } else { return when (val response = withContext(Dispatchers.IO) { DeparturesResponse.unmarshal(result.stream!!) }) { is DeparturesResponseDev -> StopDepartures( + response.departures.map { Departure(it) }, + Stop(response.stop), + response.alerts.map { Alert(it) }) + + is DeparturesResponseV4 -> StopDepartures( response.departures.map { Departure(it) }, Stop(response.stop), response.alerts.map { Alert(it) }) @@ -189,7 +205,8 @@ override suspend fun getLine( context: Context, feedID: String, lineName: String, lineID: String ): Line? { - val result = xyz.apiote.bimba.czwek.api.getLine(context, Server.get(context), feedID, lineName, lineID) + val result = + xyz.apiote.bimba.czwek.api.getLine(context, Server.get(context), feedID, lineName, lineID) if (result.error != null) { if (result.stream != null) { val response = withContext(Dispatchers.IO) { ErrorResponse.unmarshal(result.stream) } @@ -203,6 +220,7 @@ withContext(Dispatchers.IO) { LineResponse.unmarshal(result.stream!!) }) { is LineResponseDev -> Line(response.line) is LineResponseV1 -> Line(response.line) is LineResponseV2 -> Line(response.line) + is LineResponseV3 -> Line(response.line) else -> null } } @@ -225,7 +243,12 @@ query: String?, position: Position?, context: Context, type: String ): List<Queryable>? { val result = when (type) { "query" -> { - xyz.apiote.bimba.czwek.api.queryQueryables(context, Server.get(context), query!!, limit = 12) + xyz.apiote.bimba.czwek.api.queryQueryables( + context, + Server.get(context), + query!!, + limit = 12 + ) } "locate" -> xyz.apiote.bimba.czwek.api.locateQueryables( @@ -272,6 +295,14 @@ when (it) { is StopV2 -> Stop(it) is LineV2 -> Line(it) else -> throw UnknownResourceException("queryablesV3", it::class) + } + } + + is QueryablesResponseV4 -> response.queryables.map { + when (it) { + is StopV2 -> Stop(it) + is LineV3 -> Line(it) + else -> throw UnknownResourceException("queryablesV4", it::class) } }