diff options
| -rw-r--r-- | packages/FusedLocation/src/com/android/location/fused/FusedLocationProvider.java | 50 |
1 files changed, 38 insertions, 12 deletions
diff --git a/packages/FusedLocation/src/com/android/location/fused/FusedLocationProvider.java b/packages/FusedLocation/src/com/android/location/fused/FusedLocationProvider.java index 7a239af98755..068074ae1b89 100644 --- a/packages/FusedLocation/src/com/android/location/fused/FusedLocationProvider.java +++ b/packages/FusedLocation/src/com/android/location/fused/FusedLocationProvider.java @@ -44,6 +44,7 @@ import com.android.internal.annotations.GuardedBy; import java.io.PrintWriter; import java.util.Objects; +import java.util.concurrent.atomic.AtomicInteger; /** Basic fused location provider implementation. */ public class FusedLocationProvider extends LocationProviderBase { @@ -69,6 +70,12 @@ public class FusedLocationProvider extends LocationProviderBase { private final BroadcastReceiver mUserChangeReceiver; @GuardedBy("mLock") + boolean mGpsPresent; + + @GuardedBy("mLock") + boolean mNlpPresent; + + @GuardedBy("mLock") private ProviderRequest mRequest; @GuardedBy("mLock") @@ -119,19 +126,28 @@ public class FusedLocationProvider extends LocationProviderBase { @Override public void onFlush(OnFlushCompleteCallback callback) { - OnFlushCompleteCallback wrapper = new OnFlushCompleteCallback() { - private int mFlushCount = 2; + synchronized (mLock) { + AtomicInteger flushCount = new AtomicInteger(0); + if (mGpsPresent) { + flushCount.incrementAndGet(); + } + if (mNlpPresent) { + flushCount.incrementAndGet(); + } - @Override - public void onFlushComplete() { - if (--mFlushCount == 0) { + OnFlushCompleteCallback wrapper = () -> { + if (flushCount.decrementAndGet() == 0) { callback.onFlushComplete(); } - } - }; + }; - mGpsListener.flush(wrapper); - mNetworkListener.flush(wrapper); + if (mGpsPresent) { + mGpsListener.flush(wrapper); + } + if (mNlpPresent) { + mNetworkListener.flush(wrapper); + } + } } @Override @@ -139,9 +155,19 @@ public class FusedLocationProvider extends LocationProviderBase { @GuardedBy("mLock") private void updateRequirementsLocked() { - long gpsInterval = mRequest.getQuality() < QUALITY_LOW_POWER ? mRequest.getIntervalMillis() - : INTERVAL_DISABLED; - long networkInterval = mRequest.getIntervalMillis(); + // it's possible there might be race conditions on device start where a provider doesn't + // appear to be present yet, but once a provider is present it shouldn't go away. + if (!mGpsPresent) { + mGpsPresent = mLocationManager.hasProvider(GPS_PROVIDER); + } + if (!mNlpPresent) { + mNlpPresent = mLocationManager.hasProvider(NETWORK_PROVIDER); + } + + long gpsInterval = + mGpsPresent && (!mNlpPresent || mRequest.getQuality() < QUALITY_LOW_POWER) + ? mRequest.getIntervalMillis() : INTERVAL_DISABLED; + long networkInterval = mNlpPresent ? mRequest.getIntervalMillis() : INTERVAL_DISABLED; mGpsListener.resetProviderRequest(gpsInterval); mNetworkListener.resetProviderRequest(networkInterval); |