Add LocationProvider interface

pull/1369/head
Alex Baker 5 years ago
parent 29fdba597b
commit a57040119b

@ -9,10 +9,7 @@ import dagger.hilt.android.components.ViewModelComponent
import dagger.hilt.android.qualifiers.ApplicationContext
import dagger.hilt.android.scopes.ActivityScoped
import dagger.hilt.android.scopes.ViewModelScoped
import org.tasks.location.MapFragment
import org.tasks.location.MapboxSearchProvider
import org.tasks.location.OsmMapFragment
import org.tasks.location.PlaceSearchProvider
import org.tasks.location.*
@Module
@InstallIn(ActivityComponent::class, ViewModelComponent::class)
@ -23,6 +20,12 @@ class LocationModule {
return MapboxSearchProvider(context)
}
@Provides
@ActivityScoped
fun getLocationProvider(@ApplicationContext context: Context): LocationProvider {
return MapboxLocationProvider(context)
}
@Provides
@ActivityScoped
fun getMapFragment(@ApplicationContext context: Context): MapFragment {

@ -33,6 +33,11 @@ internal class LocationModule {
}
}
@Provides
@ActivityScoped
fun getLocationProvider(@ApplicationContext context: Context): LocationProvider =
MapboxLocationProvider(context)
@Provides
@ActivityScoped
fun getMapFragment(@ApplicationContext context: Context): MapFragment =

@ -1,6 +1,5 @@
package org.tasks.location
import android.annotation.SuppressLint
import android.app.Activity
import android.content.Intent
import android.content.res.Configuration
@ -24,9 +23,6 @@ import com.google.android.material.appbar.AppBarLayout
import com.google.android.material.appbar.AppBarLayout.Behavior.DragCallback
import com.google.android.material.appbar.AppBarLayout.OnOffsetChangedListener
import com.google.android.material.appbar.CollapsingToolbarLayout
import com.mapbox.android.core.location.LocationEngineCallback
import com.mapbox.android.core.location.LocationEngineProvider
import com.mapbox.android.core.location.LocationEngineResult
import com.todoroo.andlib.utility.AndroidUtilities
import dagger.hilt.android.AndroidEntryPoint
import io.reactivex.Single
@ -97,6 +93,7 @@ class LocationPickerActivity : InjectingAppCompatActivity(), Toolbar.OnMenuItemC
@Inject lateinit var geocoder: Geocoder
@Inject lateinit var inventory: Inventory
@Inject lateinit var colorProvider: ColorProvider
@Inject lateinit var locationProvider: LocationProvider
private var disposables: CompositeDisposable? = null
private var mapPosition: MapPosition? = null
@ -251,26 +248,17 @@ class LocationPickerActivity : InjectingAppCompatActivity(), Toolbar.OnMenuItemC
search.expandActionView()
}
@SuppressLint("MissingPermission")
private fun moveToCurrentLocation(animate: Boolean) {
if (!permissionChecker.canAccessForegroundLocation()) {
return
}
LocationEngineProvider.getBestLocationEngine(this)
.getLastLocation(
object : LocationEngineCallback<LocationEngineResult> {
override fun onSuccess(result: LocationEngineResult) {
val location = result.lastLocation
if (location != null) {
map.movePosition(
MapPosition(location.latitude, location.longitude), animate)
}
}
override fun onFailure(exception: Exception) {
toaster.longToast(exception.message)
}
})
lifecycleScope.launch {
try {
map.movePosition(locationProvider.currentLocation(), animate)
} catch (e: Exception) {
toaster.longToast(e.message)
}
}
}
private fun returnPlace(place: Place?) {

@ -0,0 +1,5 @@
package org.tasks.location
interface LocationProvider {
suspend fun currentLocation(): MapPosition
}

@ -0,0 +1,30 @@
package org.tasks.location
import android.annotation.SuppressLint
import android.content.Context
import com.mapbox.android.core.location.LocationEngineCallback
import com.mapbox.android.core.location.LocationEngineProvider
import com.mapbox.android.core.location.LocationEngineResult
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext
import kotlin.coroutines.suspendCoroutine
class MapboxLocationProvider(private val context: Context) : LocationProvider {
@SuppressLint("MissingPermission")
override suspend fun currentLocation(): MapPosition = withContext(Dispatchers.IO) {
suspendCoroutine { cont ->
LocationEngineProvider.getBestLocationEngine(context)
.getLastLocation(
object : LocationEngineCallback<LocationEngineResult> {
override fun onSuccess(result: LocationEngineResult) {
val location = result.lastLocation!!
cont.resumeWith(Result.success(MapPosition(location.latitude, location.longitude)))
}
override fun onFailure(exception: Exception) {
cont.resumeWith(Result.failure(exception))
}
})
}
}
}
Loading…
Cancel
Save