mirror of
https://github.com/ev-map/EVMap.git
synced 2026-04-23 23:57:08 -04:00
load some charger details
This commit is contained in:
@@ -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() }
|
||||
|
||||
@@ -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 {
|
||||
|
||||
}
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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
|
||||
}
|
||||
Reference in New Issue
Block a user