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

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

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