summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--location/java/com/android/internal/location/LocationProviderProxy.java19
-rw-r--r--services/java/com/android/server/LocationManagerService.java17
2 files changed, 33 insertions, 3 deletions
diff --git a/location/java/com/android/internal/location/LocationProviderProxy.java b/location/java/com/android/internal/location/LocationProviderProxy.java
index 80303f4..b40cdca 100644
--- a/location/java/com/android/internal/location/LocationProviderProxy.java
+++ b/location/java/com/android/internal/location/LocationProviderProxy.java
@@ -21,6 +21,7 @@ import android.location.ILocationProvider;
import android.location.Location;
import android.location.LocationManager;
import android.os.Bundle;
+import android.os.IBinder;
import android.os.RemoteException;
import android.util.Log;
@@ -31,7 +32,7 @@ import java.util.List;
*
* {@hide}
*/
-public class LocationProviderProxy {
+public class LocationProviderProxy implements IBinder.DeathRecipient {
private static final String TAG = "LocationProviderProxy";
@@ -39,16 +40,27 @@ public class LocationProviderProxy {
private final ILocationProvider mProvider;
private boolean mLocationTracking = false;
private long mMinTime = 0;
+ private boolean mDead;
public LocationProviderProxy(String name, ILocationProvider provider) {
mName = name;
mProvider = provider;
+ try {
+ provider.asBinder().linkToDeath(this, 0);
+ } catch (RemoteException e) {
+ Log.e(TAG, "linkToDeath failed", e);
+ mDead = true;
+ }
}
public String getName() {
return mName;
}
+ public boolean isDead() {
+ return mDead;
+ }
+
public boolean requiresNetwork() {
try {
return mProvider.requiresNetwork();
@@ -231,4 +243,9 @@ public class LocationProviderProxy {
Log.e(TAG, "removeListener failed", e);
}
}
+
+ public void binderDied() {
+ Log.w(TAG, "Location Provider " + mName + " died");
+ mDead = true;
+ }
}
diff --git a/services/java/com/android/server/LocationManagerService.java b/services/java/com/android/server/LocationManagerService.java
index 14c834b..05888e0 100644
--- a/services/java/com/android/server/LocationManagerService.java
+++ b/services/java/com/android/server/LocationManagerService.java
@@ -215,8 +215,7 @@ public class LocationManagerService extends ILocationManager.Stub implements Run
public int hashCode() {
return mKey.hashCode();
}
-
-
+
@Override
public String toString() {
if (mListener != null) {
@@ -611,6 +610,17 @@ public class LocationManagerService extends ILocationManager.Stub implements Run
}
synchronized (mLock) {
+ // check to see if we are reinstalling a dead provider
+ LocationProviderProxy oldProvider = mProvidersByName.get(name);
+ if (oldProvider != null) {
+ if (oldProvider.isDead()) {
+ Log.d(TAG, "replacing dead provider");
+ removeProvider(oldProvider);
+ } else {
+ throw new IllegalArgumentException("Provider \"" + name + "\" already exists");
+ }
+ }
+
LocationProviderProxy proxy = new LocationProviderProxy(name, provider);
addProvider(proxy);
updateProvidersLocked();
@@ -1616,6 +1626,7 @@ public class LocationManagerService extends ILocationManager.Stub implements Run
mCollector.updateLocation(location);
} catch (RemoteException e) {
Log.w(TAG, "mCollector.updateLocation failed");
+ mCollector = null;
}
}
@@ -1750,6 +1761,7 @@ public class LocationManagerService extends ILocationManager.Stub implements Run
variant, appName, addrs);
} catch (RemoteException e) {
Log.e(TAG, "getFromLocation failed", e);
+ mGeocodeProvider = null;
}
}
return null;
@@ -1768,6 +1780,7 @@ public class LocationManagerService extends ILocationManager.Stub implements Run
maxResults, language, country, variant, appName, addrs);
} catch (RemoteException e) {
Log.e(TAG, "getFromLocationName failed", e);
+ mGeocodeProvider = null;
}
}
return null;