diff --git a/app/src/main/java/com/nextcloud/talk/adapters/messages/OutcomingLocationMessageViewHolder.kt b/app/src/main/java/com/nextcloud/talk/adapters/messages/OutcomingLocationMessageViewHolder.kt
index 9e4136a43..988f7d819 100644
--- a/app/src/main/java/com/nextcloud/talk/adapters/messages/OutcomingLocationMessageViewHolder.kt
+++ b/app/src/main/java/com/nextcloud/talk/adapters/messages/OutcomingLocationMessageViewHolder.kt
@@ -267,6 +267,7 @@ class OutcomingLocationMessageViewHolder(incomingView: View) : MessageHolders
if (!locationGeoLink.isNullOrEmpty()) {
val geoLinkWithMarker = addMarkerToGeoLink(locationGeoLink!!)
val browserIntent = Intent(Intent.ACTION_VIEW, Uri.parse(geoLinkWithMarker))
+ browserIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
context!!.startActivity(browserIntent)
} else {
Toast.makeText(context, R.string.nc_common_error_sorry, Toast.LENGTH_LONG).show()
diff --git a/app/src/main/java/com/nextcloud/talk/controllers/GeocodingController.kt b/app/src/main/java/com/nextcloud/talk/controllers/GeocodingController.kt
index dd00b66ff..825ca4e4e 100644
--- a/app/src/main/java/com/nextcloud/talk/controllers/GeocodingController.kt
+++ b/app/src/main/java/com/nextcloud/talk/controllers/GeocodingController.kt
@@ -16,7 +16,6 @@ import android.view.ViewGroup
import android.view.inputmethod.EditorInfo
import android.widget.AdapterView
import android.widget.ListView
-import android.widget.Toast
import androidx.appcompat.widget.SearchView
import androidx.core.view.MenuItemCompat
import androidx.preference.PreferenceManager
@@ -27,17 +26,11 @@ import com.nextcloud.talk.adapters.GeocodingAdapter
import com.nextcloud.talk.api.NcApi
import com.nextcloud.talk.application.NextcloudTalkApplication
import com.nextcloud.talk.controllers.base.BaseController
-import com.nextcloud.talk.models.json.generic.GenericOverall
-import com.nextcloud.talk.utils.ApiUtils
import com.nextcloud.talk.utils.bundle.BundleKeys
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.IO
import kotlinx.coroutines.Dispatchers.Main
@@ -84,6 +77,10 @@ class GeocodingController(args: Bundle) : BaseController(args), SearchView.OnQue
lateinit var adapter: GeocodingAdapter
private var geocodingResults: List
= ArrayList()
+ constructor(args: Bundle, listener: LocationPickerController) : this(args) {
+ targetController = listener
+ }
+
init {
setHasOptionsMenu(true)
NextcloudTalkApplication.sharedApplication!!.componentApplication.inject(this)
@@ -114,7 +111,10 @@ class GeocodingController(args: Bundle) : BaseController(args), SearchView.OnQue
geocodingResultListView?.onItemClickListener = AdapterView.OnItemClickListener { parent, view, position, id ->
val address: Address = adapter.getItem(position) as Address
- shareLocation(address.latitude, address.longitude, address.displayName)
+
+ val listener: GeocodingResultListener? = targetController as GeocodingResultListener?
+ listener?.receiveChosenGeocodingResult(address.latitude, address.longitude, address.displayName)
+ router.popCurrentController()
}
}
@@ -216,38 +216,8 @@ class GeocodingController(args: Bundle) : BaseController(args), SearchView.OnQue
}
}
- private fun shareLocation(selectedLat: Double?, selectedLon: Double?, name : String?) {
- val objectId = "geo:$selectedLat,$selectedLon"
- val metaData: String =
- "{\"type\":\"geo-location\",\"id\":\"geo:$selectedLat,$selectedLon\",\"latitude\":\"$selectedLat\"," +
- "\"longitude\":\"$selectedLon\",\"name\":\"$name\"}"
-
- ncApi.sendLocation(
- ApiUtils.getCredentials(userUtils.currentUser?.username, userUtils.currentUser?.token),
- ApiUtils.getUrlToSendLocation(userUtils.currentUser?.baseUrl, roomToken),
- "geo-location",
- objectId,
- metaData
- )
- .subscribeOn(Schedulers.io())
- .observeOn(AndroidSchedulers.mainThread())
- .subscribe(object : Observer {
- override fun onSubscribe(d: Disposable) {
- }
-
- override fun onNext(t: GenericOverall) {
- router.popCurrentController()
- }
-
- override fun onError(e: Throwable) {
- Log.e(TAG, "error when trying to share location", e)
- Toast.makeText(context, R.string.nc_common_error_sorry, Toast.LENGTH_LONG).show()
- router.popCurrentController()
- }
-
- override fun onComplete() {
- }
- })
+ interface GeocodingResultListener {
+ fun receiveChosenGeocodingResult(lat: Double, lon: Double, name: String)
}
companion object {
diff --git a/app/src/main/java/com/nextcloud/talk/controllers/LocationPickerController.kt b/app/src/main/java/com/nextcloud/talk/controllers/LocationPickerController.kt
index 56917ab0a..2849b7c42 100644
--- a/app/src/main/java/com/nextcloud/talk/controllers/LocationPickerController.kt
+++ b/app/src/main/java/com/nextcloud/talk/controllers/LocationPickerController.kt
@@ -56,7 +56,8 @@ import org.osmdroid.views.overlay.mylocation.MyLocationNewOverlay
import javax.inject.Inject
@AutoInjector(NextcloudTalkApplication::class)
-class LocationPickerController(args: Bundle) : BaseController(args), SearchView.OnQueryTextListener {
+class LocationPickerController(args: Bundle) : BaseController(args), SearchView.OnQueryTextListener,
+ GeocodingController.GeocodingResultListener {
@Inject
lateinit var ncApi: NcApi
@@ -84,9 +85,9 @@ class LocationPickerController(args: Bundle) : BaseController(args), SearchView.
@JvmField
var shareLocation: LinearLayout? = null
- @BindView(R.id.gps_accuracy)
+ @BindView(R.id.place_name)
@JvmField
- var gpsAccuracy: TextView? = null
+ var placeName: TextView? = null
@BindView(R.id.share_location_description)
@JvmField
@@ -99,6 +100,11 @@ class LocationPickerController(args: Bundle) : BaseController(args), SearchView.
var searchItem: MenuItem? = null
var searchView: SearchView? = null
+ var receivedChosenGeocodingResult: Boolean = false
+ var geocodedLat: Double = 0.0
+ var geocodedLon: Double = 0.0
+ var geocodedName: String = ""
+
init {
setHasOptionsMenu(true)
NextcloudTalkApplication.sharedApplication!!.componentApplication.inject(this)
@@ -132,11 +138,15 @@ class LocationPickerController(args: Bundle) : BaseController(args), SearchView.
}
override fun onViewBound(view: View) {
- setCurrentLocationDescription()
+ setLocationDescription(false, receivedChosenGeocodingResult)
shareLocation?.isClickable = false
shareLocation?.setOnClickListener {
if (readyToShareLocation) {
- shareLocation()
+ shareLocation(
+ map?.mapCenter?.latitude,
+ map?.mapCenter?.longitude,
+ placeName?.text.toString()
+ )
} else {
Log.d(TAG, "readyToShareLocation was false while user tried to share location.")
}
@@ -170,7 +180,7 @@ class LocationPickerController(args: Bundle) : BaseController(args), SearchView.
bundle.putString(BundleKeys.KEY_GEOCODING_QUERY, query)
bundle.putString(BundleKeys.KEY_ROOM_TOKEN, roomToken)
router.pushController(
- RouterTransaction.with(GeocodingController(bundle))
+ RouterTransaction.with(GeocodingController(bundle, this))
.pushChangeHandler(HorizontalChangeHandler())
.popChangeHandler(HorizontalChangeHandler())
)
@@ -205,32 +215,48 @@ class LocationPickerController(args: Bundle) : BaseController(args), SearchView.
map?.overlays?.add(locationOverlay)
val mapController = map?.controller
- mapController?.setZoom(12.0)
+
+ if (receivedChosenGeocodingResult) {
+ mapController?.setZoom(14.0)
+ } else {
+ mapController?.setZoom(12.0)
+ }
var myLocation: GeoPoint
- myLocation = GeoPoint(52.0, 13.0)
+ myLocation = GeoPoint(13.0, 52.0)
+ var zoomToCurrentPositionAllowed = !receivedChosenGeocodingResult
locationOverlay.runOnFirstFix(Runnable {
- activity!!.runOnUiThread {
- myLocation = locationOverlay.myLocation
- mapController?.setCenter(myLocation)
+ myLocation = locationOverlay.myLocation
+ if (zoomToCurrentPositionAllowed) {
+ activity!!.runOnUiThread {
+ mapController?.setZoom(12.0)
+ mapController?.setCenter(myLocation)
+ }
}
})
+ if (receivedChosenGeocodingResult && geocodedLat != 0.0 && geocodedLon != 0.0) {
+ mapController?.setCenter(GeoPoint(geocodedLat, geocodedLon))
+ }
+
btCenterMap?.setOnClickListener(View.OnClickListener {
- map?.controller?.animateTo(myLocation)
- setCurrentLocationDescription()
+ mapController?.animateTo(myLocation)
moveToCurrentLocationWasClicked = true
})
map?.addMapListener(DelayedMapListener(object : MapListener {
override fun onScroll(paramScrollEvent: ScrollEvent): Boolean {
if (moveToCurrentLocationWasClicked) {
+ setLocationDescription(true, false)
moveToCurrentLocationWasClicked = false
+ } else if (receivedChosenGeocodingResult) {
+ shareLocation?.isClickable = true
+ setLocationDescription(false, true)
+ receivedChosenGeocodingResult = false
} else {
shareLocation?.isClickable = true
- shareLocationDescription?.text = "Share this location"
- gpsAccuracy?.text = ""
+ setLocationDescription(false, false)
}
readyToShareLocation = true
return true
@@ -242,15 +268,24 @@ class LocationPickerController(args: Bundle) : BaseController(args), SearchView.
}))
}
- private fun setCurrentLocationDescription() {
- shareLocationDescription?.text = "Share current location"
- gpsAccuracy?.text = "Accuracy: xx m"
+ private fun setLocationDescription(isGpsLocation: Boolean, isGeocodedResult: Boolean) {
+ when {
+ isGpsLocation -> {
+ shareLocationDescription?.text = "Share current location"
+ placeName?.text = ""
+ }
+ isGeocodedResult -> {
+ shareLocationDescription?.text = "Share this location"
+ placeName?.text = geocodedName
+ }
+ else -> {
+ shareLocationDescription?.text = "Share this location"
+ placeName?.text = ""
+ }
+ }
}
- private fun shareLocation() {
- val selectedLat: Double? = map?.mapCenter?.latitude
- val selectedLon: Double? = map?.mapCenter?.longitude
- val name = ""
+ private fun shareLocation(selectedLat: Double?, selectedLon: Double?, name: String?) {
val objectId = "geo:$selectedLat,$selectedLon"
val metaData: String =
"{\"type\":\"geo-location\",\"id\":\"geo:$selectedLat,$selectedLon\",\"latitude\":\"$selectedLat\"," +
@@ -297,7 +332,7 @@ class LocationPickerController(args: Bundle) : BaseController(args), SearchView.
Log.d(TAG, "Permission is revoked")
return false
}
- } else { //permission is automatically granted on sdk<23 upon installation
+ } else {
Log.d(TAG, "Permission is granted")
return true
}
@@ -320,6 +355,13 @@ class LocationPickerController(args: Bundle) : BaseController(args), SearchView.
}
}
+ override fun receiveChosenGeocodingResult(lat: Double, lon: Double, name: String) {
+ receivedChosenGeocodingResult = true
+ geocodedLat = lat
+ geocodedLon = lon
+ geocodedName = name
+ }
+
companion object {
private val TAG = "LocationPickerController"
private val REQUEST_PERMISSIONS_REQUEST_CODE = 1
diff --git a/app/src/main/res/layout/controller_location.xml b/app/src/main/res/layout/controller_location.xml
index 251106d32..4c7824cac 100644
--- a/app/src/main/res/layout/controller_location.xml
+++ b/app/src/main/res/layout/controller_location.xml
@@ -81,7 +81,7 @@
android:gravity="center_vertical">