diff --git a/app/src/main/kotlin/me/eternal/purrfectsnap/ui/manager/pages/location/BetterLocationRoot.kt b/app/src/main/kotlin/me/eternal/purrfectsnap/ui/manager/pages/location/BetterLocationRoot.kt index 3f702d53..d753ecae 100644 --- a/app/src/main/kotlin/me/eternal/purrfectsnap/ui/manager/pages/location/BetterLocationRoot.kt +++ b/app/src/main/kotlin/me/eternal/purrfectsnap/ui/manager/pages/location/BetterLocationRoot.kt @@ -357,6 +357,7 @@ class BetterLocationRoot : Routes.Route() { marker = marker, mapView = mapView, locationSearchProvider = context.config.root.global.betterLocation.locationSearchProvider.get(), + googleMapsApiKey = context.config.root.global.betterLocation.googleMapsApiKey.get(), saveCoordinates = { addSavedCoordinateDialog = true } diff --git a/app/src/main/kotlin/me/eternal/purrfectsnap/ui/util/AlertDialogs.kt b/app/src/main/kotlin/me/eternal/purrfectsnap/ui/util/AlertDialogs.kt index 94f30650..7cc73704 100644 --- a/app/src/main/kotlin/me/eternal/purrfectsnap/ui/util/AlertDialogs.kt +++ b/app/src/main/kotlin/me/eternal/purrfectsnap/ui/util/AlertDialogs.kt @@ -595,6 +595,7 @@ class AlertDialogs( marker: MutableState = remember { mutableStateOf(null) }, mapView: MutableState = remember { mutableStateOf(null) }, locationSearchProvider: String = "osm", + googleMapsApiKey: String = "", saveCoordinates: (() -> Unit)? = null, dismiss: () -> Unit = {} ) { @@ -702,28 +703,56 @@ class AlertDialogs( val resultsScrollState = rememberScrollState() suspend fun search() { - okHttpClient.newCall(Request.Builder() - .url("https://nominatim.openstreetmap.org/search".toUri().buildUpon().appendQueryParameter("q", locationName).appendQueryParameter("format", "jsonv2").build().toString()) - .header("User-Agent", Constants.OSM_USER_AGENT) - .build() - ).await().use { response -> - if (!response.isSuccessful) { - return@use + if (locationSearchProvider == "google_maps") { + // Google Maps Search + okHttpClient.newCall(Request.Builder() + .url("https://maps.googleapis.com/maps/api/geocode/json".toUri().buildUpon() + .appendQueryParameter("address", locationName) + .appendQueryParameter("key", googleMapsApiKey) + .build().toString()) + .build() + ).await().use { response -> + if (!response.isSuccessful) return@use + runCatching { + val jsonResponse = JsonParser.parseString(response.body?.string() ?: "{}").asJsonObject + if (jsonResponse.has("results")) { + val results = jsonResponse.getAsJsonArray("results") + addressResults = results.take(5).map { jsonElement -> + val result = jsonElement.asJsonObject + val geometry = result.getAsJsonObject("geometry").getAsJsonObject("location") + Triple( + result.get("formatted_address").asString, + geometry.get("lat").asString, + geometry.get("lng").asString + ) + } + } + } } - - runCatching { - val body = JsonParser.parseString(response.body?.string() ?: "[]").asJsonArray - addressResults = body.take(5).map { jsonElement -> - val jsonObject = jsonElement.asJsonObject - Triple( - jsonObject.get("display_name").asString, - jsonObject.get("lat").asString, - jsonObject.get("lon").asString - ) + } else { + // OSM Nominatim Search (Existing Logic) + okHttpClient.newCall(Request.Builder() + .url("https://nominatim.openstreetmap.org/search".toUri().buildUpon() + .appendQueryParameter("q", locationName) + .appendQueryParameter("format", "jsonv2") + .build().toString()) + .header("User-Agent", Constants.OSM_USER_AGENT) + .build() + ).await().use { response -> + if (!response.isSuccessful) return@use + runCatching { + val body = JsonParser.parseString(response.body?.string() ?: "[]").asJsonArray + addressResults = body.take(5).map { jsonElement -> + val jsonObject = jsonElement.asJsonObject + Triple( + jsonObject.get("display_name").asString, + jsonObject.get("lat").asString, + jsonObject.get("lon").asString + ) + } } } } - searchJob = null }