location: Fix mock provider support

Allow mock providers to be used for proximity alerts.
Clear calling identity so mock provider support does not fail due to
lack of INSTALL_LOCATION_PROVIDER permission.

Signed-off-by: Mike Lockwood <lockwood@android.com>
diff --git a/services/java/com/android/server/LocationManagerService.java b/services/java/com/android/server/LocationManagerService.java
index c924d8d..14c834b 100644
--- a/services/java/com/android/server/LocationManagerService.java
+++ b/services/java/com/android/server/LocationManagerService.java
@@ -918,12 +918,9 @@
                 }
            }
         }
-        if (LocationManager.GPS_PROVIDER.equals(provider) ||
-                LocationManager.NETWORK_PROVIDER.equals(provider)) {
-            for (ProximityAlert alert : mProximityAlerts.values()) {
-                if (alert.mUid == uid) {
-                    return true;
-                }
+        for (ProximityAlert alert : mProximityAlerts.values()) {
+            if (alert.mUid == uid) {
+                return true;
             }
         }
         return false;
@@ -1359,13 +1356,8 @@
             mProximityListener = new ProximityListener();
             mProximityReceiver = new Receiver(mProximityListener);
 
-            LocationProviderProxy provider = mProvidersByName.get(LocationManager.GPS_PROVIDER);
-            if (provider != null) {
-                requestLocationUpdatesLocked(provider.getName(), 1000L, 1.0f, mProximityReceiver);
-            }
-
-            provider = mProvidersByName.get(LocationManager.NETWORK_PROVIDER);
-            if (provider != null) {
+            for (int i = mProviders.size() - 1; i >= 0; i--) {
+                LocationProviderProxy provider = mProviders.get(i);
                 requestLocationUpdatesLocked(provider.getName(), 1000L, 1.0f, mProximityReceiver);
             }
         }
@@ -1809,9 +1801,13 @@
             if (mProvidersByName.get(name) != null) {
                 throw new IllegalArgumentException("Provider \"" + name + "\" already exists");
             }
+
+            // clear calling identity so INSTALL_LOCATION_PROVIDER permission is not required
+            long identity = Binder.clearCallingIdentity();
             addProvider(new LocationProviderProxy(name, provider));
             mMockProviders.put(name, provider);
             updateProvidersLocked();
+            Binder.restoreCallingIdentity(identity);
         }
     }
 
@@ -1835,7 +1831,10 @@
             if (mockProvider == null) {
                 throw new IllegalArgumentException("Provider \"" + provider + "\" unknown");
             }
+            // clear calling identity so INSTALL_LOCATION_PROVIDER permission is not required
+            long identity = Binder.clearCallingIdentity();
             mockProvider.setLocation(loc);
+            Binder.restoreCallingIdentity(identity);
         }
     }