diff --git a/app/src/main/java/net/vonforst/evmap/adapter/DetailsAdapter.kt b/app/src/main/java/net/vonforst/evmap/adapter/DetailsAdapter.kt index 0e55d9d8..e2910fda 100644 --- a/app/src/main/java/net/vonforst/evmap/adapter/DetailsAdapter.kt +++ b/app/src/main/java/net/vonforst/evmap/adapter/DetailsAdapter.kt @@ -18,7 +18,7 @@ class DetailsAdapter : DataBindingAdapter() { 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 - ) + ), ) } diff --git a/app/src/main/java/net/vonforst/evmap/api/ChargepointApi.kt b/app/src/main/java/net/vonforst/evmap/api/ChargepointApi.kt index 45fca565..063d11b3 100644 --- a/app/src/main/java/net/vonforst/evmap/api/ChargepointApi.kt +++ b/app/src/main/java/net/vonforst/evmap/api/ChargepointApi.kt @@ -30,6 +30,8 @@ interface ChargepointApi { suspend fun getReferenceData(): Resource fun getFilters(referenceData: ReferenceData, sp: StringProvider): List> + + fun getName(): String } interface StringProvider { diff --git a/app/src/main/java/net/vonforst/evmap/api/goingelectric/GoingElectricApi.kt b/app/src/main/java/net/vonforst/evmap/api/goingelectric/GoingElectricApi.kt index 5871723a..8a99292d 100644 --- a/app/src/main/java/net/vonforst/evmap/api/goingelectric/GoingElectricApi.kt +++ b/app/src/main/java/net/vonforst/evmap/api/goingelectric/GoingElectricApi.kt @@ -128,6 +128,9 @@ class GoingElectricApiWrapper( context: Context? = null ) : ChargepointApi { val api = GoingElectricApi.create(apikey, baseurl, context) + + override fun getName() = "GoingElectric.de" + override suspend fun getChargepoints( referenceData: ReferenceData, bounds: LatLngBounds, diff --git a/app/src/main/java/net/vonforst/evmap/api/goingelectric/GoingElectricModel.kt b/app/src/main/java/net/vonforst/evmap/api/goingelectric/GoingElectricModel.kt index 82c67c6d..07314f48 100644 --- a/app/src/main/java/net/vonforst/evmap/api/goingelectric/GoingElectricModel.kt +++ b/app/src/main/java/net/vonforst/evmap/api/goingelectric/GoingElectricModel.kt @@ -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 ) } diff --git a/app/src/main/java/net/vonforst/evmap/api/openchargemap/OpenChargeMapApi.kt b/app/src/main/java/net/vonforst/evmap/api/openchargemap/OpenChargeMapApi.kt index b0b28898..c1d7c48c 100644 --- a/app/src/main/java/net/vonforst/evmap/api/openchargemap/OpenChargeMapApi.kt +++ b/app/src/main/java/net/vonforst/evmap/api/openchargemap/OpenChargeMapApi.kt @@ -86,6 +86,8 @@ class OpenChargeMapApiWrapper( ) : ChargepointApi { val api = OpenChargeMapApi.create(apikey, baseurl, context) + override fun getName() = "OpenChargeMap.org" + override suspend fun getChargepoints( referenceData: ReferenceData, bounds: LatLngBounds, diff --git a/app/src/main/java/net/vonforst/evmap/api/openchargemap/OpenChargeMapModel.kt b/app/src/main/java/net/vonforst/evmap/api/openchargemap/OpenChargeMapModel.kt index 1f5ea206..ad5c29bd 100644 --- a/app/src/main/java/net/vonforst/evmap/api/openchargemap/OpenChargeMapModel.kt +++ b/app/src/main/java/net/vonforst/evmap/api/openchargemap/OpenChargeMapModel.kt @@ -23,7 +23,9 @@ data class OCMChargepoint( @Json(name = "AddressInfo") val addressInfo: OCMAddressInfo, @Json(name = "Connections") val connections: List, @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?, ) \ No newline at end of file diff --git a/app/src/main/java/net/vonforst/evmap/fragment/MapFragment.kt b/app/src/main/java/net/vonforst/evmap/fragment/MapFragment.kt index d1c7b535..ac2c07eb 100644 --- a/app/src/main/java/net/vonforst/evmap/fragment/MapFragment.kt +++ b/app/src/main/java/net/vonforst/evmap/fragment/MapFragment.kt @@ -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) diff --git a/app/src/main/java/net/vonforst/evmap/model/ChargersModel.kt b/app/src/main/java/net/vonforst/evmap/model/ChargersModel.kt index 40db7a09..efa116b9 100644 --- a/app/src/main/java/net/vonforst/evmap/model/ChargersModel.kt +++ b/app/src/main/java/net/vonforst/evmap/model/ChargersModel.kt @@ -31,6 +31,7 @@ data class ChargeLocation( val chargepoints: List, 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?, val chargecards: List?, @Embedded val openinghours: OpeningHours?, - @Embedded val cost: Cost? + @Embedded val cost: Cost?, + val license: String? ) : ChargepointListItem(), Equatable { /** * maximum power available from this charger. diff --git a/app/src/main/java/net/vonforst/evmap/storage/Database.kt b/app/src/main/java/net/vonforst/evmap/storage/Database.kt index a1a02c41..74dd69c3 100644 --- a/app/src/main/java/net/vonforst/evmap/storage/Database.kt +++ b/app/src/main/java/net/vonforst/evmap/storage/Database.kt @@ -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() + } + } + } } } \ No newline at end of file diff --git a/app/src/main/java/net/vonforst/evmap/viewmodel/MapViewModel.kt b/app/src/main/java/net/vonforst/evmap/viewmodel/MapViewModel.kt index 73461d07..09c33465 100644 --- a/app/src/main/java/net/vonforst/evmap/viewmodel/MapViewModel.kt +++ b/app/src/main/java/net/vonforst/evmap/viewmodel/MapViewModel.kt @@ -42,6 +42,10 @@ class MapViewModel(application: Application, geApiKey: String) : AndroidViewMode R.string.openchargemap_key ) ) + val apiType: Class> + get() = api.javaClass + val apiName: String + get() = api.getName() // = GoingElectricApiWrapper(geApiKey, context = application) private var db = AppDatabase.getInstance(application) diff --git a/app/src/main/res/drawable/ic_license.xml b/app/src/main/res/drawable/ic_license.xml new file mode 100644 index 00000000..a86a1710 --- /dev/null +++ b/app/src/main/res/drawable/ic_license.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/layout/detail_view.xml b/app/src/main/res/layout/detail_view.xml index a4268688..55808239 100644 --- a/app/src/main/res/layout/detail_view.xml +++ b/app/src/main/res/layout/detail_view.xml @@ -53,6 +53,10 @@ name="expanded" type="Boolean" /> + +