DO NOT MERGE - workaround location timeout The location manager timeout mechanism is not working at all. It does not timeout as specified. Implemented the timeout completely in cell broadcast handler and used a different location manager API. Fix: 172173511 Test: Manual Change-Id: I3271e994c7d867927ba9feacd4d1c094e9dd0d12
diff --git a/src/com/android/cellbroadcastservice/CellBroadcastHandler.java b/src/com/android/cellbroadcastservice/CellBroadcastHandler.java index f97707f..9507a86 100644 --- a/src/com/android/cellbroadcastservice/CellBroadcastHandler.java +++ b/src/com/android/cellbroadcastservice/CellBroadcastHandler.java
@@ -38,11 +38,11 @@ import android.content.res.Resources; import android.database.Cursor; import android.location.Location; +import android.location.LocationListener; import android.location.LocationManager; import android.location.LocationRequest; import android.net.Uri; import android.os.Bundle; -import android.os.CancellationSignal; import android.os.Handler; import android.os.HandlerExecutor; import android.os.Looper; @@ -800,10 +800,10 @@ private final List<LocationUpdateCallback> mCallbacks; private final Context mContext; private final Handler mLocationHandler; + private final LocationListener mLocationListener; + private final Runnable mTimeoutCallback; private boolean mLocationUpdateInProgress; - private final Runnable mTimeoutCallback; - private CancellationSignal mCancellationSignal; LocationRequester(Context context, LocationManager locationManager, Handler handler) { mLocationManager = locationManager; @@ -811,6 +811,7 @@ mContext = context; mLocationHandler = handler; mLocationUpdateInProgress = false; + mLocationListener = this::onLocationUpdate; mTimeoutCallback = this::onLocationTimeout; } @@ -830,15 +831,13 @@ private void onLocationTimeout() { Log.e(TAG, "Location request timeout"); - if (mCancellationSignal != null) { - mCancellationSignal.cancel(); - } onLocationUpdate(null); } private void onLocationUpdate(@Nullable Location location) { mLocationUpdateInProgress = false; mLocationHandler.removeCallbacks(mTimeoutCallback); + mLocationManager.removeUpdates(mLocationListener); LatLng latLng = null; float accuracy = 0; if (location != null) { @@ -873,19 +872,13 @@ .setInterval(0) .setFastestInterval(0) .setSmallestDisplacement(0) - .setNumUpdates(1) - .setExpireIn(TimeUnit.SECONDS.toMillis(maximumWaitTimeS)); + .setNumUpdates(1); if (DBG) { Log.d(TAG, "Location request=" + request); } try { - mCancellationSignal = new CancellationSignal(); - mLocationManager.getCurrentLocation(request, mCancellationSignal, + mLocationManager.requestLocationUpdates(request, new HandlerExecutor(mLocationHandler), this::onLocationUpdate); - // TODO: Remove the following workaround in S. We need to enforce the timeout - // before location manager adds the support for timeout value which is less - // than 30 seconds. After that we can rely on location manager's timeout - // mechanism. mLocationHandler.postDelayed(mTimeoutCallback, TimeUnit.SECONDS.toMillis(maximumWaitTimeS)); } catch (IllegalArgumentException e) {