From b445be99bba5f81fa9cea2e397d39cd981f5e7d8 Mon Sep 17 00:00:00 2001 From: johan12345 Date: Sat, 13 Aug 2022 12:28:07 +0200 Subject: [PATCH] remove dependency on unmaintained Lost library use Android's own Location APIs instead --- app/build.gradle | 1 - app/src/main/AndroidManifest.xml | 11 --- .../evmap/fragment/FavoritesFragment.kt | 44 +++++------ .../vonforst/evmap/fragment/MapFragment.kt | 73 +++++++------------ 4 files changed, 47 insertions(+), 82 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 6b221dc1..59c0ec28 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -173,7 +173,6 @@ dependencies { implementation "com.mikepenz:aboutlibraries:$about_libs_version" implementation 'com.airbnb.android:lottie:4.1.0' implementation 'io.michaelrocks.bimap:bimap:1.1.0' - implementation 'com.mapzen.android:lost:3.0.2' implementation 'com.google.guava:guava:29.0-android' implementation 'com.github.pengrad:mapscaleview:1.6.0' implementation 'com.github.romandanylyk:PageIndicatorView:b1bad589b5' diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 12d14eb0..afa85797 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -261,17 +261,6 @@ android:name="android.app.shortcuts" android:resource="@xml/shortcuts" /> - - - - - - - - \ No newline at end of file diff --git a/app/src/main/java/net/vonforst/evmap/fragment/FavoritesFragment.kt b/app/src/main/java/net/vonforst/evmap/fragment/FavoritesFragment.kt index 959095f2..0f3ae9f6 100644 --- a/app/src/main/java/net/vonforst/evmap/fragment/FavoritesFragment.kt +++ b/app/src/main/java/net/vonforst/evmap/fragment/FavoritesFragment.kt @@ -1,6 +1,9 @@ package net.vonforst.evmap.fragment +import android.content.Context import android.graphics.Canvas +import android.location.Criteria +import android.location.LocationManager import android.os.Bundle import android.view.Gravity import android.view.LayoutInflater @@ -20,8 +23,6 @@ import com.car2go.maps.model.LatLng import com.google.android.material.color.MaterialColors import com.google.android.material.snackbar.Snackbar import com.google.android.material.transition.MaterialFadeThrough -import com.mapzen.android.lost.api.LocationServices -import com.mapzen.android.lost.api.LostApiClient import net.vonforst.evmap.MapsActivity import net.vonforst.evmap.R import net.vonforst.evmap.adapter.DataBindingAdapter @@ -34,9 +35,9 @@ import net.vonforst.evmap.utils.checkAnyLocationPermission import net.vonforst.evmap.viewmodel.FavoritesViewModel import net.vonforst.evmap.viewmodel.viewModelFactory -class FavoritesFragment : Fragment(), LostApiClient.ConnectionCallbacks { +class FavoritesFragment : Fragment() { private lateinit var binding: FragmentFavoritesBinding - private var locationClient: LostApiClient? = null + private lateinit var locationManager: LocationManager private var toDelete: Favorite? = null private var deleteSnackbar: Snackbar? = null private lateinit var adapter: FavoritesAdapter @@ -52,8 +53,9 @@ class FavoritesFragment : Fragment(), LostApiClient.ConnectionCallbacks { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - locationClient = LostApiClient.Builder(requireContext()) - .addConnectionCallbacks(this).build() + + locationManager = + requireContext().getSystemService(Context.LOCATION_SERVICE) as LocationManager enterTransition = MaterialFadeThrough() exitTransition = MaterialFadeThrough() @@ -109,8 +111,6 @@ class FavoritesFragment : Fragment(), LostApiClient.ConnectionCallbacks { } createTouchHelper().attachToRecyclerView(binding.favsList) - locationClient!!.connect() - binding.swipeRefresh.setOnRefreshListener { vm.reloadAvailability() { binding.swipeRefresh.isRefreshing = false @@ -118,27 +118,21 @@ class FavoritesFragment : Fragment(), LostApiClient.ConnectionCallbacks { } } - override fun onConnected() { - val context = this.context ?: return - if (context.checkAnyLocationPermission()) { - val location = LocationServices.FusedLocationApi.getLastLocation(locationClient!!) - if (location != null) { - vm.location.value = LatLng(location.latitude, location.longitude) + override fun onStart() { + super.onStart() + + if (requireContext().checkAnyLocationPermission()) { + val provider = locationManager.getBestProvider(Criteria().apply { + accuracy = Criteria.ACCURACY_FINE + }, true) ?: return + + val location = locationManager.getLastKnownLocation(provider) + location?.let { + vm.location.value = LatLng(it.latitude, it.longitude) } } } - override fun onConnectionSuspended() { - - } - - override fun onDestroy() { - super.onDestroy() - locationClient?.let { - if (it.isConnected) it.disconnect() - } - } - fun delete(fav: FavoriteWithDetail) { val position = vm.listData.value?.indexOfFirst { it.fav.favorite.favoriteId == fav.favorite.favoriteId } diff --git a/app/src/main/java/net/vonforst/evmap/fragment/MapFragment.kt b/app/src/main/java/net/vonforst/evmap/fragment/MapFragment.kt index 7f589a21..fae66733 100644 --- a/app/src/main/java/net/vonforst/evmap/fragment/MapFragment.kt +++ b/app/src/main/java/net/vonforst/evmap/fragment/MapFragment.kt @@ -7,8 +7,9 @@ import android.content.Context import android.content.pm.PackageManager import android.content.res.Configuration import android.graphics.Color +import android.location.Criteria import android.location.Geocoder -import android.location.Location +import android.location.LocationManager import android.os.Bundle import android.text.method.KeyListener import android.view.* @@ -23,6 +24,7 @@ import androidx.appcompat.app.AlertDialog import androidx.appcompat.widget.PopupMenu import androidx.core.app.ActivityCompat import androidx.core.content.ContextCompat +import androidx.core.location.LocationListenerCompat import androidx.core.view.* import androidx.databinding.DataBindingUtil import androidx.fragment.app.Fragment @@ -60,10 +62,6 @@ import com.mahc.custombottomsheetbehavior.BottomSheetBehaviorGoogleMapsLike import com.mahc.custombottomsheetbehavior.BottomSheetBehaviorGoogleMapsLike.STATE_COLLAPSED import com.mahc.custombottomsheetbehavior.BottomSheetBehaviorGoogleMapsLike.STATE_HIDDEN import com.mahc.custombottomsheetbehavior.MergedAppBarLayoutBehavior -import com.mapzen.android.lost.api.LocationListener -import com.mapzen.android.lost.api.LocationRequest -import com.mapzen.android.lost.api.LocationServices -import com.mapzen.android.lost.api.LostApiClient import com.stfalcon.imageviewer.StfalconImageViewer import io.michaelrocks.bimap.HashBiMap import io.michaelrocks.bimap.MutableBiMap @@ -95,14 +93,13 @@ import kotlin.collections.contains import kotlin.collections.set -class MapFragment : Fragment(), OnMapReadyCallback, MapsActivity.FragmentCallback, - LostApiClient.ConnectionCallbacks, LocationListener { +class MapFragment : Fragment(), OnMapReadyCallback, MapsActivity.FragmentCallback { private lateinit var binding: FragmentMapBinding private val vm: MapViewModel by viewModels() private val galleryVm: GalleryViewModel by activityViewModels() private var mapFragment: MapFragment? = null private var map: AnyMap? = null - private lateinit var locationClient: LostApiClient + private lateinit var locationManager: LocationManager private var requestingLocationUpdates = false private lateinit var bottomSheetBehavior: BottomSheetBehaviorGoogleMapsLike private lateinit var detailAppBarBehavior: MergedAppBarLayoutBehavior @@ -147,10 +144,8 @@ class MapFragment : Fragment(), OnMapReadyCallback, MapsActivity.FragmentCallbac prefs = PreferenceDataSource(requireContext()) - locationClient = LostApiClient.Builder(requireContext()) - .addConnectionCallbacks(this) - .build() - locationClient.connect() + locationManager = + requireContext().getSystemService(Context.LOCATION_SERVICE) as LocationManager clusterIconGenerator = ClusterIconGenerator(requireContext()) enterTransition = MaterialFadeThrough() @@ -319,7 +314,6 @@ class MapFragment : Fragment(), OnMapReadyCallback, MapsActivity.FragmentCallbac vm.reloadPrefs() if (requestingLocationUpdates && requireContext().checkAnyLocationPermission() - && locationClient.isConnected ) { requestLocationUpdates() } @@ -1016,16 +1010,16 @@ class MapFragment : Fragment(), OnMapReadyCallback, MapsActivity.FragmentCallbac map.uiSettings.setMyLocationButtonEnabled(false) if (moveTo) { vm.myLocationEnabled.value = true - if (locationClient.isConnected) { - moveToLastLocation(map, animate) - requestLocationUpdates() - } + moveToLastLocation(map, animate) + requestLocationUpdates() } } @RequiresPermission(anyOf = [ACCESS_FINE_LOCATION, ACCESS_COARSE_LOCATION]) private fun moveToLastLocation(map: AnyMap, animate: Boolean) { - val location = LocationServices.FusedLocationApi.getLastLocation(locationClient) + val provider = getLocationProvider() ?: return + + val location = locationManager.getLastKnownLocation(provider) if (location != null) { val latLng = LatLng(location.latitude, location.longitude) vm.location.value = latLng @@ -1038,6 +1032,10 @@ class MapFragment : Fragment(), OnMapReadyCallback, MapsActivity.FragmentCallbac } } + private fun getLocationProvider() = locationManager.getBestProvider(Criteria().apply { + accuracy = Criteria.ACCURACY_FINE + }, true) + @Synchronized private fun updateMap(chargepoints: List) { val map = this.map ?: return @@ -1300,38 +1298,26 @@ class MapFragment : Fragment(), OnMapReadyCallback, MapsActivity.FragmentCallbac return binding.root } - override fun onConnected() { - val map = this.map ?: return - val context = this.context ?: return - if (vm.myLocationEnabled.value == true) { - if (context.checkAnyLocationPermission()) { - moveToLastLocation(map, false) - requestLocationUpdates() - } - } - } - @RequiresPermission(ACCESS_FINE_LOCATION) private fun requestLocationUpdates() { - val request: LocationRequest = LocationRequest.create() - .setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY) - .setInterval(5000) - LocationServices.FusedLocationApi.requestLocationUpdates(locationClient, request, this) + val provider = getLocationProvider() ?: return + + locationManager.requestLocationUpdates( + provider, + 5000, + 1f, + locationListener + ) requestingLocationUpdates = true } private fun removeLocationUpdates() { - if (locationClient.isConnected) { - LocationServices.FusedLocationApi.removeLocationUpdates(locationClient, this) - } + locationManager.removeUpdates(locationListener) } - override fun onConnectionSuspended() { - } - - override fun onLocationChanged(location: Location?) { - val map = this.map ?: return - if (location == null || vm.myLocationEnabled.value == false) return + private val locationListener = LocationListenerCompat { location -> + val map = this.map ?: return@LocationListenerCompat + if (vm.myLocationEnabled.value == false) return@LocationListenerCompat val latLng = LatLng(location.latitude, location.longitude) val oldLoc = vm.location.value @@ -1356,8 +1342,5 @@ class MapFragment : Fragment(), OnMapReadyCallback, MapsActivity.FragmentCallbac override fun onDestroy() { super.onDestroy() - if (locationClient.isConnected) { - locationClient.disconnect() - } } } \ No newline at end of file