mirror of
https://github.com/nextcloud/talk-android.git
synced 2024-11-26 15:05:44 +03:00
reverse-geocode before sharing if address-name is empty
Signed-off-by: Marcel Hibbe <dev@mhibbe.de>
This commit is contained in:
parent
d7a8935709
commit
49b2455a23
1 changed files with 63 additions and 2 deletions
|
@ -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.database.user.UserUtils
|
||||
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.android.schedulers.AndroidSchedulers
|
||||
import io.reactivex.disposables.Disposable
|
||||
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.events.DelayedMapListener
|
||||
import org.osmdroid.events.MapListener
|
||||
|
@ -93,6 +106,8 @@ class LocationPickerController(args: Bundle) : BaseController(args), SearchView.
|
|||
@JvmField
|
||||
var shareLocationDescription: TextView? = null
|
||||
|
||||
var nominatimClient: JsonNominatimClient? = null
|
||||
|
||||
var roomToken: String?
|
||||
|
||||
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 metaData: String =
|
||||
"{\"type\":\"geo-location\",\"id\":\"geo:$selectedLat,$selectedLon\",\"latitude\":\"$selectedLat\"," +
|
||||
"\"longitude\":\"$selectedLon\",\"name\":\"$name\"}"
|
||||
"\"longitude\":\"$selectedLon\",\"name\":\"$locationName\"}"
|
||||
|
||||
ncApi.sendLocation(
|
||||
ApiUtils.getCredentials(userUtils.currentUser?.username, userUtils.currentUser?.token),
|
||||
|
@ -362,6 +390,39 @@ class LocationPickerController(args: Bundle) : BaseController(args), SearchView.
|
|||
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 {
|
||||
private val TAG = "LocationPickerController"
|
||||
private val REQUEST_PERMISSIONS_REQUEST_CODE = 1
|
||||
|
|
Loading…
Reference in a new issue