load some charger details

This commit is contained in:
Johan von Forstner
2020-03-16 20:36:16 +01:00
parent 7b54b0a127
commit 0bb310f822
8 changed files with 118 additions and 12 deletions

View File

@@ -38,17 +38,23 @@ class MapsActivity : AppCompatActivity(), OnMapReadyCallback {
mapFragment.getMapAsync(this)
api = GoingElectricApi.create(getString(R.string.goingelectric_key))
val behavior = BottomSheetBehaviorGoogleMapsLike.from(binding.bottomSheet);
val behavior = BottomSheetBehaviorGoogleMapsLike.from(binding.bottomSheet)
binding.addOnPropertyChangedCallback(object : Observable.OnPropertyChangedCallback() {
var previousCharger = binding.charger
override fun onPropertyChanged(sender: Observable?, propertyId: Int) {
when (propertyId) {
BR.charger -> {
if (binding.charger != null) {
if (propertyId == BR.charger) {
if (binding.charger != null) {
if (previousCharger == null ||
previousCharger!!.id != binding.charger!!.id
) {
behavior.state = BottomSheetBehaviorGoogleMapsLike.STATE_COLLAPSED
} else {
behavior.state = BottomSheetBehaviorGoogleMapsLike.STATE_HIDDEN
loadChargerDetails()
}
} else {
behavior.state = BottomSheetBehaviorGoogleMapsLike.STATE_HIDDEN
}
previousCharger = binding.charger
}
}
@@ -94,6 +100,7 @@ class MapsActivity : AppCompatActivity(), OnMapReadyCallback {
clusterDistance = 70
).enqueue(object : Callback<ChargepointList> {
override fun onFailure(call: Call<ChargepointList>, t: Throwable) {
//TODO: show error message
t.printStackTrace()
}
@@ -102,6 +109,7 @@ class MapsActivity : AppCompatActivity(), OnMapReadyCallback {
response: Response<ChargepointList>
) {
if (!response.isSuccessful || response.body()!!.status != "ok") {
//TODO: show error message
return
}
@@ -111,6 +119,28 @@ class MapsActivity : AppCompatActivity(), OnMapReadyCallback {
})
}
private fun loadChargerDetails() {
val id = binding.charger?.id ?: return
api.getChargepointDetail(id).enqueue(object : Callback<ChargepointList> {
override fun onFailure(call: Call<ChargepointList>, t: Throwable) {
//TODO: show error message
t.printStackTrace()
}
override fun onResponse(
call: Call<ChargepointList>,
response: Response<ChargepointList>
) {
if (!response.isSuccessful || response.body()!!.status != "ok") {
//TODO: show error message
return
}
binding.charger = response.body()!!.chargelocations[0] as ChargeLocation
}
})
}
private fun updateMap() {
markers.keys.forEach { it.remove() }
clusterMarkers.forEach { it.remove() }

View File

@@ -55,4 +55,49 @@ internal class ChargepointListItemJsonAdapter(val moshi: Moshi) :
override fun toJson(writer: JsonWriter, value: ChargepointListItem?) {
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}
}
}
internal class JsonObjectOrFalseAdapter<T> private constructor(
private val objectDelegate: JsonAdapter<T>?
) : JsonAdapter<T>() {
class Factory() : JsonAdapter.Factory {
override fun create(
type: Type,
annotations: Set<Annotation>?,
moshi: Moshi
): JsonAdapter<*>? {
val clazz = Types.getRawType(type)
return when (hasJsonObjectOrFalseAnnotation(annotations)) {
false -> null
true -> JsonObjectOrFalseAdapter(moshi.adapter(clazz))
}
}
}
override fun fromJson(reader: JsonReader) = when (reader.peek()) {
JsonReader.Token.BOOLEAN -> when (reader.nextBoolean()) {
false -> null // Response was false
else ->
throw IllegalStateException("Non-false boolean for @JsonObjectOrFalse field")
}
JsonReader.Token.BEGIN_OBJECT -> objectDelegate?.fromJson(reader)
JsonReader.Token.STRING -> objectDelegate?.fromJson(reader)
JsonReader.Token.NUMBER -> objectDelegate?.fromJson(reader)
else ->
throw IllegalStateException("Non-object-non-boolean value for @JsonObjectOrFalse field")
}
override fun toJson(writer: JsonWriter, value: T?) =
objectDelegate?.toJson(writer, value) ?: Unit
}
private fun hasJsonObjectOrFalseAnnotation(annotations: Set<Annotation>?) =
annotations?.firstOrNull { it.annotationClass == JsonObjectOrFalse::class } != null
@JsonQualifier
@Retention(AnnotationRetention.RUNTIME)
@Target(AnnotationTarget.FIELD)
annotation class JsonObjectOrFalse {
}

View File

@@ -19,6 +19,9 @@ interface GoingElectricApi {
@Query("cluster_distance") clusterDistance: Int
): Call<ChargepointList>
@GET("/chargepoints/")
fun getChargepointDetail(@Query("ge_id") id: Long): Call<ChargepointList>
companion object {
fun create(apikey: String): GoingElectricApi {
val client = OkHttpClient.Builder()
@@ -34,6 +37,7 @@ interface GoingElectricApi {
val moshi = Moshi.Builder()
.add(ChargepointListItemJsonAdapterFactory())
.add(JsonObjectOrFalseAdapter.Factory())
.build()
val retrofit = Retrofit.Builder()

View File

@@ -18,10 +18,15 @@ data class ChargeLocation(
val coordinates: Coordinate,
val address: Address,
val chargepoints: List<Chargepoint>,
//val network: String,
@JsonObjectOrFalse val network: String?,
val url: String,
@Json(name = "fault_report") val faultReport: Boolean,
val verified: Boolean
// @Json(name = "fault_report") val faultReport: Boolean, <- Object or false in detail, true or false in overview
val verified: Boolean,
// only shown in details:
@JsonObjectOrFalse val operator: String?,
@Json(name = "general_information") @JsonObjectOrFalse val generalInformation: String?,
val photos: List<ChargerPhoto>?
//val chargecards: Boolean?
) : ChargepointListItem() {
val maxPower: Double
get() {
@@ -40,6 +45,9 @@ data class ChargeLocation(
}
}
@JsonClass(generateAdapter = true)
data class ChargerPhoto(val id: String)
@JsonClass(generateAdapter = true)
data class ChargeLocationCluster(
val clusterCount: Int,

View File

@@ -6,4 +6,9 @@ import androidx.databinding.BindingAdapter
@BindingAdapter("app:goneUnless")
fun goneUnless(view: View, visible: Boolean) {
view.visibility = if (visible) View.VISIBLE else View.GONE
}
@BindingAdapter("app:invisibleUnless")
fun invisibleUnless(view: View, visible: Boolean) {
view.visibility = if (visible) View.VISIBLE else View.INVISIBLE
}