Implement operators and licenses for OpenChargeMap data

This commit is contained in:
johan12345
2021-06-20 19:09:00 +02:00
parent 7f8403cfb4
commit e29d40bca2
15 changed files with 116 additions and 28 deletions

View File

@@ -18,7 +18,7 @@ class DetailsAdapter : DataBindingAdapter<DetailsAdapter.Detail>() {
data class Detail(
val icon: Int,
val contentDescription: Int,
val text: CharSequence,
val text: CharSequence?,
val detailText: CharSequence? = null,
val links: Boolean = true,
val clickable: Boolean = false,
@@ -119,7 +119,7 @@ fun buildDetails(
loc.coordinates.formatDecimal(),
links = false,
clickable = true
)
),
)
}

View File

@@ -30,6 +30,8 @@ interface ChargepointApi<out T : ReferenceData> {
suspend fun getReferenceData(): Resource<T>
fun getFilters(referenceData: ReferenceData, sp: StringProvider): List<Filter<FilterValue>>
fun getName(): String
}
interface StringProvider {

View File

@@ -128,6 +128,9 @@ class GoingElectricApiWrapper(
context: Context? = null
) : ChargepointApi<GEReferenceData> {
val api = GoingElectricApi.create(apikey, baseurl, context)
override fun getName() = "GoingElectric.de"
override suspend fun getChargepoints(
referenceData: ReferenceData,
bounds: LatLngBounds,

View File

@@ -61,7 +61,8 @@ data class GEChargeLocation(
address.convert(),
chargepoints.map { it.convert() },
network,
url,
"https:${url}",
"https:${url}edit/",
faultReport?.convert(),
verified,
barrierFree,
@@ -72,7 +73,8 @@ data class GEChargeLocation(
photos?.map { it.convert(apikey) },
chargecards?.map { it.convert() },
openinghours?.convert(),
cost?.convert()
cost?.convert(),
null
)
}

View File

@@ -86,6 +86,8 @@ class OpenChargeMapApiWrapper(
) : ChargepointApi<OCMReferenceData> {
val api = OpenChargeMapApi.create(apikey, baseurl, context)
override fun getName() = "OpenChargeMap.org"
override suspend fun getChargepoints(
referenceData: ReferenceData,
bounds: LatLngBounds,

View File

@@ -23,7 +23,9 @@ data class OCMChargepoint(
@Json(name = "AddressInfo") val addressInfo: OCMAddressInfo,
@Json(name = "Connections") val connections: List<OCMConnection>,
@Json(name = "NumberOfPoints") val numPoints: Int,
@Json(name = "GeneralComments") val generalComments: String?
@Json(name = "GeneralComments") val generalComments: String?,
@Json(name = "OperatorInfo") val operatorInfo: OCMOperator?,
@Json(name = "DataProvider") val dataProvider: OCMDataProvider?
) {
fun convert(refData: OCMReferenceData) = ChargeLocation(
id,
@@ -31,19 +33,21 @@ data class OCMChargepoint(
Coordinate(addressInfo.latitude, addressInfo.longitude),
addressInfo.toAddress(refData),
connections.map { it.convert(refData) },
null,
operatorInfo?.title,
"https://openchargemap.org/site/poi/details/$id",
"https://openchargemap.org/site/poi/edit/$id",
null,
recentlyVerified,
null,
null, //TODO: OperatorInfo
null,
generalComments,
null,
addressInfo.accessComments,
null, // TODO: MediaItems,
null,
null,
cost?.let { Cost(descriptionShort = it) }
cost?.let { Cost(descriptionShort = it) },
dataProvider?.let { "© ${it.title}" + if (it.license != null) ". ${it.license}" else "" }
)
}
@@ -128,4 +132,22 @@ data class OCMCountry(
@Json(name = "ISOCode") val isoCode: String,
@Json(name = "ContinentCode") val continentCode: String?,
@Json(name = "Title") val title: String
)
@JsonClass(generateAdapter = true)
data class OCMDataProvider(
@Json(name = "ID") val id: Long,
@Json(name = "WebsiteURL") val websiteUrl: String?,
@Json(name = "Title") val title: String,
@Json(name = "License") val license: String?
)
@JsonClass(generateAdapter = true)
data class OCMOperator(
@Json(name = "ID") val id: Long,
@Json(name = "WebsiteURL") val websiteUrl: String?,
@Json(name = "Title") val title: String,
@Json(name = "ContactEmail") val contactEmail: String?,
@Json(name = "PhonePrimaryContact") val contactTelephone1: String?,
@Json(name = "PhoneSecondaryContact") val contactTelephone2: String?,
)

View File

@@ -66,6 +66,7 @@ import net.vonforst.evmap.*
import net.vonforst.evmap.adapter.ConnectorAdapter
import net.vonforst.evmap.adapter.DetailsAdapter
import net.vonforst.evmap.adapter.GalleryAdapter
import net.vonforst.evmap.api.goingelectric.GoingElectricApiWrapper
import net.vonforst.evmap.autocomplete.handleAutocompleteResult
import net.vonforst.evmap.autocomplete.launchAutocomplete
import net.vonforst.evmap.databinding.FragmentMapBinding
@@ -292,10 +293,10 @@ class MapFragment : Fragment(), OnMapReadyCallback, MapsActivity.FragmentCallbac
binding.layers.btnClose.setOnClickListener {
closeLayersMenu()
}
binding.detailView.goingelectricButton.setOnClickListener {
binding.detailView.sourceButton.setOnClickListener {
val charger = vm.charger.value?.data
if (charger != null) {
(activity as? MapsActivity)?.openUrl("https:${charger.url}")
(activity as? MapsActivity)?.openUrl(charger.url)
}
}
binding.detailView.btnChargeprice.setOnClickListener {
@@ -323,19 +324,22 @@ class MapFragment : Fragment(), OnMapReadyCallback, MapsActivity.FragmentCallbac
R.id.menu_share -> {
val charger = vm.charger.value?.data
if (charger != null) {
(activity as? MapsActivity)?.shareUrl("https:${charger.url}")
(activity as? MapsActivity)?.shareUrl(charger.url)
}
true
}
R.id.menu_edit -> {
val charger = vm.charger.value?.data
if (charger != null) {
(activity as? MapsActivity)?.openUrl("https:${charger.url}edit/")
Toast.makeText(
requireContext(),
R.string.edit_on_goingelectric_info,
Toast.LENGTH_LONG
).show()
if (charger?.editUrl != null) {
(activity as? MapsActivity)?.openUrl(charger.editUrl)
if (vm.apiType == GoingElectricApiWrapper::class.java) {
// instructions specific to GoingElectric
Toast.makeText(
requireContext(),
R.string.edit_on_goingelectric_info,
Toast.LENGTH_LONG
).show()
}
}
true
}
@@ -627,7 +631,7 @@ class MapFragment : Fragment(), OnMapReadyCallback, MapsActivity.FragmentCallbac
(activity as? MapsActivity)?.showLocation(charger)
}
R.drawable.ic_fault_report -> {
(activity as? MapsActivity)?.openUrl("https:${charger.url}")
(activity as? MapsActivity)?.openUrl(charger.url)
}
R.drawable.ic_payment -> {
showPaymentMethodsDialog(charger)

View File

@@ -31,6 +31,7 @@ data class ChargeLocation(
val chargepoints: List<Chargepoint>,
val network: String?,
val url: String,
val editUrl: String?,
@Embedded(prefix = "fault_report_") val faultReport: FaultReport?,
val verified: Boolean,
val barrierFree: Boolean?,
@@ -42,7 +43,8 @@ data class ChargeLocation(
val photos: List<ChargerPhoto>?,
val chargecards: List<ChargeCardId>?,
@Embedded val openinghours: OpeningHours?,
@Embedded val cost: Cost?
@Embedded val cost: Cost?,
val license: String?
) : ChargepointListItem(), Equatable {
/**
* maximum power available from this charger.

View File

@@ -20,7 +20,7 @@ import net.vonforst.evmap.model.*
GEPlug::class,
GENetwork::class,
GEChargeCard::class
], version = 11
], version = 12
)
@TypeConverters(Converters::class)
abstract class AppDatabase : RoomDatabase() {
@@ -37,7 +37,8 @@ abstract class AppDatabase : RoomDatabase() {
Room.databaseBuilder(context, AppDatabase::class.java, "evmap.db")
.addMigrations(
MIGRATION_2, MIGRATION_3, MIGRATION_4, MIGRATION_5, MIGRATION_6,
MIGRATION_7, MIGRATION_8, MIGRATION_9, MIGRATION_10, MIGRATION_11
MIGRATION_7, MIGRATION_8, MIGRATION_9, MIGRATION_10, MIGRATION_11,
MIGRATION_12
)
.addCallback(object : Callback() {
override fun onCreate(db: SupportSQLiteDatabase) {
@@ -172,5 +173,18 @@ abstract class AppDatabase : RoomDatabase() {
db.execSQL("ALTER TABLE `ChargeLocation` ADD `barrierFree` INTEGER")
}
}
private val MIGRATION_12 = object : Migration(11, 12) {
override fun migrate(db: SupportSQLiteDatabase) {
db.beginTransaction()
try {
db.execSQL("ALTER TABLE `ChargeLocation` ADD `editUrl` TEXT")
db.execSQL("ALTER TABLE `ChargeLocation` ADD `license` TEXT")
db.setTransactionSuccessful()
} finally {
db.endTransaction()
}
}
}
}
}

View File

@@ -42,6 +42,10 @@ class MapViewModel(application: Application, geApiKey: String) : AndroidViewMode
R.string.openchargemap_key
)
)
val apiType: Class<ChargepointApi<ReferenceData>>
get() = api.javaClass
val apiName: String
get() = api.getName()
// = GoingElectricApiWrapper(geApiKey, context = application)
private var db = AppDatabase.getInstance(application)