OSDN Git Service

Fix addGeofence() and addProximityAlert().
authorNick Pelly <npelly@google.com>
Fri, 17 Aug 2012 22:09:44 +0000 (15:09 -0700)
committerNick Pelly <npelly@google.com>
Fri, 17 Aug 2012 22:25:21 +0000 (15:25 -0700)
Need to clear the callers identity before calling into geofence manager
because it in turn calls fused location API's.

Change-Id: I7993b0b8b2a947ff93c37a7c9d29ca0e7c95f9a8

services/java/com/android/server/LocationManagerService.java

index 69ae833..8a564f7 100644 (file)
@@ -968,7 +968,7 @@ public class LocationManagerService extends ILocationManager.Stub implements Obs
         final int uid = Binder.getCallingUid();
         Receiver recevier = checkListenerOrIntent(listener, intent, pid, uid, packageName);
 
-        // so wakelock calls will succeed (not totally sure this is still needed)
+        // providers may use public location API's, need to clear identity
         long identity = Binder.clearCallingIdentity();
         try {
             synchronized (mLock) {
@@ -1018,7 +1018,7 @@ public class LocationManagerService extends ILocationManager.Stub implements Obs
         final int uid = Binder.getCallingUid();
         Receiver receiver = checkListenerOrIntent(listener, intent, pid, uid, packageName);
 
-        // so wakelock calls will succeed (not totally sure this is still needed)
+        // providers may use public location API's, need to clear identity
         long identity = Binder.clearCallingIdentity();
         try {
             synchronized (mLock) {
@@ -1107,7 +1107,14 @@ public class LocationManagerService extends ILocationManager.Stub implements Obs
 
         if (D) Log.d(TAG, "requestGeofence: " + request + " " + geofence + " " + intent);
 
-        mGeofenceManager.addFence(request, geofence, intent, Binder.getCallingUid(), packageName);
+        // geo-fence manager uses the public location API, need to clear identity
+        int uid = Binder.getCallingUid();
+        long identity = Binder.clearCallingIdentity();
+        try {
+            mGeofenceManager.addFence(request, geofence, intent, uid, packageName);
+        } finally {
+            Binder.restoreCallingIdentity(identity);
+        }
     }
 
     @Override
@@ -1118,7 +1125,13 @@ public class LocationManagerService extends ILocationManager.Stub implements Obs
 
         if (D) Log.d(TAG, "removeGeofence: " + geofence + " " + intent);
 
-        mGeofenceManager.removeFence(geofence, intent);
+        // geo-fence manager uses the public location API, need to clear identity
+        long identity = Binder.clearCallingIdentity();
+        try {
+            mGeofenceManager.removeFence(geofence, intent);
+        } finally {
+            Binder.restoreCallingIdentity(identity);
+        }
     }