Bimba.git

commit f40911ae839b4894fb46ccaee689428a2ce79443

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)
 					}
 				}