From a57040119b0781051b9534d61239f94e5e2abd88 Mon Sep 17 00:00:00 2001 From: Alex Baker Date: Wed, 10 Feb 2021 17:09:57 -0600 Subject: [PATCH] Add LocationProvider interface --- .../org/tasks/injection/LocationModule.kt | 11 ++++--- .../org/tasks/injection/LocationModule.kt | 5 ++++ .../tasks/location/LocationPickerActivity.kt | 28 +++++------------ .../org/tasks/location/LocationProvider.kt | 5 ++++ .../tasks/location/MapboxLocationProvider.kt | 30 +++++++++++++++++++ 5 files changed, 55 insertions(+), 24 deletions(-) create mode 100644 app/src/main/java/org/tasks/location/LocationProvider.kt create mode 100644 app/src/main/java/org/tasks/location/MapboxLocationProvider.kt diff --git a/app/src/generic/java/org/tasks/injection/LocationModule.kt b/app/src/generic/java/org/tasks/injection/LocationModule.kt index 86af508b9..8af05d0cc 100644 --- a/app/src/generic/java/org/tasks/injection/LocationModule.kt +++ b/app/src/generic/java/org/tasks/injection/LocationModule.kt @@ -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 { diff --git a/app/src/googleplay/java/org/tasks/injection/LocationModule.kt b/app/src/googleplay/java/org/tasks/injection/LocationModule.kt index f164f6119..9bf5c671a 100644 --- a/app/src/googleplay/java/org/tasks/injection/LocationModule.kt +++ b/app/src/googleplay/java/org/tasks/injection/LocationModule.kt @@ -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 = diff --git a/app/src/main/java/org/tasks/location/LocationPickerActivity.kt b/app/src/main/java/org/tasks/location/LocationPickerActivity.kt index 8c4198aa7..c3b1bfd6c 100644 --- a/app/src/main/java/org/tasks/location/LocationPickerActivity.kt +++ b/app/src/main/java/org/tasks/location/LocationPickerActivity.kt @@ -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 { - 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?) { diff --git a/app/src/main/java/org/tasks/location/LocationProvider.kt b/app/src/main/java/org/tasks/location/LocationProvider.kt new file mode 100644 index 000000000..9852eff57 --- /dev/null +++ b/app/src/main/java/org/tasks/location/LocationProvider.kt @@ -0,0 +1,5 @@ +package org.tasks.location + +interface LocationProvider { + suspend fun currentLocation(): MapPosition +} \ No newline at end of file diff --git a/app/src/main/java/org/tasks/location/MapboxLocationProvider.kt b/app/src/main/java/org/tasks/location/MapboxLocationProvider.kt new file mode 100644 index 000000000..f796c04ee --- /dev/null +++ b/app/src/main/java/org/tasks/location/MapboxLocationProvider.kt @@ -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 { + 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)) + } + }) + } + } +} \ No newline at end of file