From 1ff414a46d525cfbc1ba9922b39be4a61d5d4cb8 Mon Sep 17 00:00:00 2001 From: Dmitry Yunitsky Date: Tue, 10 May 2016 19:20:34 +0300 Subject: [PATCH] [android] Fixed crash due to incorrect state of Fused location provider after pending result retrieval. --- .../location/GoogleFusedLocationProvider.java | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/android/src/com/mapswithme/maps/location/GoogleFusedLocationProvider.java b/android/src/com/mapswithme/maps/location/GoogleFusedLocationProvider.java index 0db7d2f3d6..7bbd2b6c7a 100644 --- a/android/src/com/mapswithme/maps/location/GoogleFusedLocationProvider.java +++ b/android/src/com/mapswithme/maps/location/GoogleFusedLocationProvider.java @@ -22,10 +22,11 @@ class GoogleFusedLocationProvider extends BaseLocationProvider GoogleApiClient.OnConnectionFailedListener, LocationListener { - private static final String GS_LOCATION_PROVIDER = "fused"; + private static final String GMS_LOCATION_PROVIDER = "fused"; private final GoogleApiClient mGoogleApiClient; private LocationRequest mLocationRequest; + private PendingResult mLocationSettingsResult; public GoogleFusedLocationProvider() { @@ -66,6 +67,8 @@ class GoogleFusedLocationProvider extends BaseLocationProvider if (mGoogleApiClient.isConnected()) LocationServices.FusedLocationApi.removeLocationUpdates(mGoogleApiClient, this); + if (mLocationSettingsResult != null && !mLocationSettingsResult.isCanceled()) + mLocationSettingsResult.cancel(); mGoogleApiClient.disconnect(); } @@ -80,7 +83,7 @@ class GoogleFusedLocationProvider extends BaseLocationProvider private boolean isFromFusedProvider(Location location) { - return GS_LOCATION_PROVIDER.equalsIgnoreCase(location.getProvider()); + return GMS_LOCATION_PROVIDER.equalsIgnoreCase(location.getProvider()); } @Override @@ -94,10 +97,8 @@ class GoogleFusedLocationProvider extends BaseLocationProvider { LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder().addLocationRequest(mLocationRequest); builder.setAlwaysShow(true); // hides 'never' button in resolve dialog afterwards. - PendingResult result = - LocationServices.SettingsApi.checkLocationSettings(mGoogleApiClient, builder.build()); - - result.setResultCallback(new ResultCallback() + mLocationSettingsResult = LocationServices.SettingsApi.checkLocationSettings(mGoogleApiClient, builder.build()); + mLocationSettingsResult.setResultCallback(new ResultCallback() { @Override public void onResult(@NonNull LocationSettingsResult locationSettingsResult) @@ -123,12 +124,14 @@ class GoogleFusedLocationProvider extends BaseLocationProvider private void requestLocationUpdates() { + if (!mGoogleApiClient.isConnected()) + return; + LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this); LocationHelper.INSTANCE.registerSensorListeners(); final Location last = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient); if (last != null) LocationHelper.INSTANCE.saveLocation(last); - } @Override