reverse-geocode before sharing if address-name is empty

Signed-off-by: Marcel Hibbe <dev@mhibbe.de>
This commit is contained in:
Marcel Hibbe 2021-06-07 01:32:17 +02:00 committed by Andy Scherzinger
parent d7a8935709
commit 49b2455a23
No known key found for this signature in database
GPG Key ID: 6CADC7E3523C308B

View File

@ -38,10 +38,23 @@ import com.nextcloud.talk.utils.bundle.BundleKeys
import com.nextcloud.talk.utils.bundle.BundleKeys.KEY_ROOM_TOKEN import com.nextcloud.talk.utils.bundle.BundleKeys.KEY_ROOM_TOKEN
import com.nextcloud.talk.utils.database.user.UserUtils import com.nextcloud.talk.utils.database.user.UserUtils
import com.nextcloud.talk.utils.preferences.AppPreferences import com.nextcloud.talk.utils.preferences.AppPreferences
import fr.dudie.nominatim.client.JsonNominatimClient
import fr.dudie.nominatim.model.Address
import io.reactivex.Observer import io.reactivex.Observer
import io.reactivex.android.schedulers.AndroidSchedulers import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.disposables.Disposable import io.reactivex.disposables.Disposable
import io.reactivex.schedulers.Schedulers import io.reactivex.schedulers.Schedulers
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import org.apache.http.client.HttpClient
import org.apache.http.conn.ClientConnectionManager
import org.apache.http.conn.scheme.Scheme
import org.apache.http.conn.scheme.SchemeRegistry
import org.apache.http.conn.ssl.SSLSocketFactory
import org.apache.http.impl.client.DefaultHttpClient
import org.apache.http.impl.conn.SingleClientConnManager
import org.osmdroid.config.Configuration.getInstance import org.osmdroid.config.Configuration.getInstance
import org.osmdroid.events.DelayedMapListener import org.osmdroid.events.DelayedMapListener
import org.osmdroid.events.MapListener import org.osmdroid.events.MapListener
@ -93,6 +106,8 @@ class LocationPickerController(args: Bundle) : BaseController(args), SearchView.
@JvmField @JvmField
var shareLocationDescription: TextView? = null var shareLocationDescription: TextView? = null
var nominatimClient: JsonNominatimClient? = null
var roomToken: String? var roomToken: String?
var moveToCurrentLocationWasClicked: Boolean = true var moveToCurrentLocationWasClicked: Boolean = true
@ -285,11 +300,24 @@ class LocationPickerController(args: Bundle) : BaseController(args), SearchView.
} }
} }
private fun shareLocation(selectedLat: Double?, selectedLon: Double?, name: String?) { private fun shareLocation(selectedLat: Double?, selectedLon: Double?, locationName: String?) {
if (selectedLat != null || selectedLon != null) {
var name = locationName
if (name.isNullOrEmpty()) {
initGeocoder()
searchPlaceNameForCoordinates(selectedLat!!, selectedLon!!)
} else {
executeShareLocation(selectedLat, selectedLon, locationName)
}
}
}
private fun executeShareLocation(selectedLat: Double?, selectedLon: Double?, locationName: String?) {
val objectId = "geo:$selectedLat,$selectedLon" val objectId = "geo:$selectedLat,$selectedLon"
val metaData: String = val metaData: String =
"{\"type\":\"geo-location\",\"id\":\"geo:$selectedLat,$selectedLon\",\"latitude\":\"$selectedLat\"," + "{\"type\":\"geo-location\",\"id\":\"geo:$selectedLat,$selectedLon\",\"latitude\":\"$selectedLat\"," +
"\"longitude\":\"$selectedLon\",\"name\":\"$name\"}" "\"longitude\":\"$selectedLon\",\"name\":\"$locationName\"}"
ncApi.sendLocation( ncApi.sendLocation(
ApiUtils.getCredentials(userUtils.currentUser?.username, userUtils.currentUser?.token), ApiUtils.getCredentials(userUtils.currentUser?.username, userUtils.currentUser?.token),
@ -362,6 +390,39 @@ class LocationPickerController(args: Bundle) : BaseController(args), SearchView.
geocodedName = name geocodedName = name
} }
private fun initGeocoder() {
val registry = SchemeRegistry()
registry.register(Scheme("https", SSLSocketFactory.getSocketFactory(), 443))
val connexionManager: ClientConnectionManager = SingleClientConnManager(null, registry)
val httpClient: HttpClient = DefaultHttpClient(connexionManager, null)
val baseUrl = "https://nominatim.openstreetmap.org/"
val email = "android@nextcloud.com"
nominatimClient = JsonNominatimClient(baseUrl, httpClient, email)
}
private fun searchPlaceNameForCoordinates(lat: Double, lon: Double): Boolean {
CoroutineScope(Dispatchers.IO).launch {
executeGeocodingRequest(lat, lon)
}
return true
}
private suspend fun executeGeocodingRequest(lat: Double, lon: Double) {
var address: Address? = null
try {
address = nominatimClient!!.getAddress(lon, lat)
} catch (e: Exception) {
Log.e(TAG, "Failed to get geocoded addresses", e)
}
updateResultOnMainThread(lat, lon, address?.displayName)
}
private suspend fun updateResultOnMainThread(lat: Double, lon: Double, addressName: String?) {
withContext(Dispatchers.Main) {
executeShareLocation(lat, lon, addressName)
}
}
companion object { companion object {
private val TAG = "LocationPickerController" private val TAG = "LocationPickerController"
private val REQUEST_PERMISSIONS_REQUEST_CODE = 1 private val REQUEST_PERMISSIONS_REQUEST_CODE = 1