LocationManager:  Recover if process containing NetworkLocation provider crashes

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 14c834b..05888e0 100644
--- a/services/java/com/android/server/LocationManagerService.java
+++ b/services/java/com/android/server/LocationManagerService.java
@@ -215,8 +215,7 @@
         public int hashCode() {
             return mKey.hashCode();
         }
-        
-        
+
         @Override
         public String toString() {
             if (mListener != null) {
@@ -611,6 +610,17 @@
         }
 
         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 @@
                                 mCollector.updateLocation(location);
                             } catch (RemoteException e) {
                                 Log.w(TAG, "mCollector.updateLocation failed");
+                                mCollector = null;
                             }
                         }
 
@@ -1750,6 +1761,7 @@
                         variant, appName,  addrs);
             } catch (RemoteException e) {
                 Log.e(TAG, "getFromLocation failed", e);
+                mGeocodeProvider = null;
             }
         }
         return null;
@@ -1768,6 +1780,7 @@
                         maxResults, language, country, variant, appName, addrs);
             } catch (RemoteException e) {
                 Log.e(TAG, "getFromLocationName failed", e);
+                mGeocodeProvider = null;
             }
         }
         return null;