diff --git a/android/src/main/java/com/reactnativecommunity/geolocation/PlayServicesLocationManager.java b/android/src/main/java/com/reactnativecommunity/geolocation/PlayServicesLocationManager.java index 423f7a5..f0f387a 100644 --- a/android/src/main/java/com/reactnativecommunity/geolocation/PlayServicesLocationManager.java +++ b/android/src/main/java/com/reactnativecommunity/geolocation/PlayServicesLocationManager.java @@ -26,17 +26,21 @@ import com.google.android.gms.location.Priority; import com.google.android.gms.location.SettingsClient; +import java.util.ArrayList; +import java.util.List; + @SuppressLint("MissingPermission") public class PlayServicesLocationManager extends BaseLocationManager { private FusedLocationProviderClient mFusedLocationClient; - private LocationCallback mLocationCallback; - private LocationCallback mSingleLocationCallback; + private List mPendingLocationCallbacks; private SettingsClient mLocationServicesSettingsClient; + private LocationCallback mLocationCallback; protected PlayServicesLocationManager(ReactApplicationContext reactContext) { super(reactContext); mFusedLocationClient = LocationServices.getFusedLocationProviderClient(reactContext); mLocationServicesSettingsClient = LocationServices.getSettingsClient(reactContext); + mPendingLocationCallbacks = new ArrayList<>(); } @Override @@ -46,9 +50,10 @@ public void getCurrentLocationData(ReadableMap options, Callback success, Callba Activity currentActivity = mReactContext.getCurrentActivity(); if (currentActivity == null) { - mSingleLocationCallback = createSingleLocationCallback(success, error); - checkLocationSettings(options, mSingleLocationCallback, error); - return; + LocationCallback singleLocationCallback = createSingleLocationCallback(success, error); + mPendingLocationCallbacks.add(singleLocationCallback); + checkLocationSettings(options, singleLocationCallback, error); + return; } try { @@ -57,8 +62,9 @@ public void getCurrentLocationData(ReadableMap options, Callback success, Callba if (location != null && (SystemClock.currentTimeMillis() - location.getTime()) < locationOptions.maximumAge) { success.invoke(locationToMap(location)); } else { - mSingleLocationCallback = createSingleLocationCallback(success, error); - checkLocationSettings(options, mSingleLocationCallback, error); + LocationCallback singleLocationCallback = createSingleLocationCallback(success, error); + mPendingLocationCallbacks.add(singleLocationCallback); + checkLocationSettings(options, singleLocationCallback, error); } }); } catch (SecurityException e) { @@ -93,10 +99,16 @@ public void onLocationAvailability(LocationAvailability locationAvailability) { @Override public void stopObserving() { - if(mLocationCallback == null) { + if(mLocationCallback == null && mPendingLocationCallbacks.isEmpty()) { return; } - mFusedLocationClient.removeLocationUpdates(mLocationCallback); + if (mLocationCallback != null) { + mFusedLocationClient.removeLocationUpdates(mLocationCallback); + } + for (LocationCallback callback : mPendingLocationCallbacks) { + mFusedLocationClient.removeLocationUpdates(callback); + } + mPendingLocationCallbacks.clear(); } private void checkLocationSettings(ReadableMap options, LocationCallback locationCallback, Callback error) { @@ -167,8 +179,8 @@ public void onLocationResult(@NonNull LocationResult locationResult) { callbackHolder.success(location); - mFusedLocationClient.removeLocationUpdates(mSingleLocationCallback); - mSingleLocationCallback = null; + mFusedLocationClient.removeLocationUpdates(this); + mPendingLocationCallbacks.remove(this); } @Override