summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--location/java/android/location/LocationManager.java24
-rw-r--r--services/core/java/com/android/server/LocationManagerService.java10
2 files changed, 21 insertions, 13 deletions
diff --git a/location/java/android/location/LocationManager.java b/location/java/android/location/LocationManager.java
index 6eb3d8d151a6..ee9e732c88a8 100644
--- a/location/java/android/location/LocationManager.java
+++ b/location/java/android/location/LocationManager.java
@@ -22,7 +22,6 @@ import static android.Manifest.permission.LOCATION_HARDWARE;
import static android.Manifest.permission.WRITE_SECURE_SETTINGS;
import android.Manifest;
-import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.RequiresFeature;
import android.annotation.RequiresPermission;
@@ -42,16 +41,11 @@ import android.os.Message;
import android.os.Process;
import android.os.RemoteException;
import android.os.UserHandle;
-import android.provider.Settings;
-import android.text.TextUtils;
-import android.util.ArraySet;
import android.util.Log;
import com.android.internal.location.ProviderProperties;
import java.util.ArrayList;
-import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
-import java.util.Set;
/**
* This class provides access to the system location services. These
@@ -331,7 +325,7 @@ public class LocationManager {
Message msg = Message.obtain();
msg.what = TYPE_LOCATION_CHANGED;
msg.obj = location;
- mListenerHandler.sendMessage(msg);
+ sendCallbackMessage(msg);
}
@Override
@@ -345,7 +339,7 @@ public class LocationManager {
b.putBundle("extras", extras);
}
msg.obj = b;
- mListenerHandler.sendMessage(msg);
+ sendCallbackMessage(msg);
}
@Override
@@ -353,7 +347,7 @@ public class LocationManager {
Message msg = Message.obtain();
msg.what = TYPE_PROVIDER_ENABLED;
msg.obj = provider;
- mListenerHandler.sendMessage(msg);
+ sendCallbackMessage(msg);
}
@Override
@@ -361,7 +355,13 @@ public class LocationManager {
Message msg = Message.obtain();
msg.what = TYPE_PROVIDER_DISABLED;
msg.obj = provider;
- mListenerHandler.sendMessage(msg);
+ sendCallbackMessage(msg);
+ }
+
+ private void sendCallbackMessage(Message msg) {
+ if (!mListenerHandler.sendMessage(msg)) {
+ locationCallbackFinished();
+ }
}
private void _handleMessage(Message msg) {
@@ -384,6 +384,10 @@ public class LocationManager {
mListener.onProviderDisabled((String) msg.obj);
break;
}
+ locationCallbackFinished();
+ }
+
+ private void locationCallbackFinished() {
try {
mService.locationCallbackFinished(this);
} catch (RemoteException e) {
diff --git a/services/core/java/com/android/server/LocationManagerService.java b/services/core/java/com/android/server/LocationManagerService.java
index 776cf47a1e56..232c151f0418 100644
--- a/services/core/java/com/android/server/LocationManagerService.java
+++ b/services/core/java/com/android/server/LocationManagerService.java
@@ -795,6 +795,7 @@ public class LocationManagerService extends ILocationManager.Stub {
* location updates.
*/
private final class Receiver implements IBinder.DeathRecipient, PendingIntent.OnFinished {
+ private static final long WAKELOCK_TIMEOUT_MILLIS = 60 * 1000;
final Identity mIdentity;
final int mAllowedResolutionLevel; // resolution level allowed to receiver
@@ -838,6 +839,10 @@ public class LocationManagerService extends ILocationManager.Stub {
workSource = new WorkSource(mIdentity.mUid, mIdentity.mPackageName);
}
mWakeLock.setWorkSource(workSource);
+
+ // For a non-reference counted wakelock, each acquire will reset the timeout, and we
+ // only need to release it once.
+ mWakeLock.setReferenceCounted(false);
}
@Override
@@ -1099,9 +1104,8 @@ public class LocationManagerService extends ILocationManager.Stub {
// this must be called while synchronized by caller in a synchronized block
// containing the sending of the broadcaset
private void incrementPendingBroadcastsLocked() {
- if (mPendingBroadcasts++ == 0) {
- mWakeLock.acquire();
- }
+ mPendingBroadcasts++;
+ mWakeLock.acquire(WAKELOCK_TIMEOUT_MILLIS);
}
private void decrementPendingBroadcastsLocked() {