Refactor ServiceWatcher
Make thread safe and lock free and fixes a variety of minor bugs. Most
of location code is under the synchronization strategy of 'throw
everything behind one massive lock'. This is a bad idea for a variety
of reasons and makes it very difficult to reason about thread safety.
Correcting this will make code easier to read and understand.
Test: Tested manually on device.
Change-Id: I42ad9b4009eabc04227008d6d562dca557087d1f
diff --git a/services/core/java/com/android/server/LocationManagerService.java b/services/core/java/com/android/server/LocationManagerService.java
index 93bdcbb..90ad09e 100644
--- a/services/core/java/com/android/server/LocationManagerService.java
+++ b/services/core/java/com/android/server/LocationManagerService.java
@@ -541,7 +541,7 @@
}
}
- private void ensureFallbackFusedProviderPresentLocked(ArrayList<String> pkgs) {
+ private void ensureFallbackFusedProviderPresentLocked(String[] pkgs) {
PackageManager pm = mContext.getPackageManager();
String systemPackageName = mContext.getPackageName();
ArrayList<HashSet<Signature>> sigSets = ServiceWatcher.getSignatureSets(mContext, pkgs);
@@ -646,16 +646,14 @@
that matches the signature of at least one package on this list.
*/
Resources resources = mContext.getResources();
- ArrayList<String> providerPackageNames = new ArrayList<>();
String[] pkgs = resources.getStringArray(
com.android.internal.R.array.config_locationProviderPackageNames);
if (D) {
Log.d(TAG, "certificates for location providers pulled from: " +
Arrays.toString(pkgs));
}
- if (pkgs != null) providerPackageNames.addAll(Arrays.asList(pkgs));
- ensureFallbackFusedProviderPresentLocked(providerPackageNames);
+ ensureFallbackFusedProviderPresentLocked(pkgs);
// bind to network provider
LocationProviderProxy networkProvider = LocationProviderProxy.createAndBind(
@@ -664,8 +662,7 @@
NETWORK_LOCATION_SERVICE_ACTION,
com.android.internal.R.bool.config_enableNetworkLocationOverlay,
com.android.internal.R.string.config_networkLocationProviderPackageName,
- com.android.internal.R.array.config_locationProviderPackageNames,
- mLocationHandler);
+ com.android.internal.R.array.config_locationProviderPackageNames);
if (networkProvider != null) {
mRealProviders.put(LocationManager.NETWORK_PROVIDER, networkProvider);
mProxyProviders.add(networkProvider);
@@ -681,8 +678,7 @@
FUSED_LOCATION_SERVICE_ACTION,
com.android.internal.R.bool.config_enableFusedLocationOverlay,
com.android.internal.R.string.config_fusedLocationProviderPackageName,
- com.android.internal.R.array.config_locationProviderPackageNames,
- mLocationHandler);
+ com.android.internal.R.array.config_locationProviderPackageNames);
if (fusedLocationProvider != null) {
addProviderLocked(fusedLocationProvider);
mProxyProviders.add(fusedLocationProvider);
@@ -697,8 +693,7 @@
mGeocodeProvider = GeocoderProxy.createAndBind(mContext,
com.android.internal.R.bool.config_enableGeocoderOverlay,
com.android.internal.R.string.config_geocoderProviderPackageName,
- com.android.internal.R.array.config_locationProviderPackageNames,
- mLocationHandler);
+ com.android.internal.R.array.config_locationProviderPackageNames);
if (mGeocodeProvider == null) {
Slog.e(TAG, "no geocoder provider found");
}
@@ -708,7 +703,6 @@
mContext, com.android.internal.R.bool.config_enableGeofenceOverlay,
com.android.internal.R.string.config_geofenceProviderPackageName,
com.android.internal.R.array.config_locationProviderPackageNames,
- mLocationHandler,
mGpsGeofenceProxy,
null);
if (provider == null) {
@@ -725,7 +719,6 @@
}
ActivityRecognitionProxy proxy = ActivityRecognitionProxy.createAndBind(
mContext,
- mLocationHandler,
activityRecognitionHardwareIsSupported,
activityRecognitionHardware,
com.android.internal.R.bool.config_enableActivityRecognitionHardwareOverlay,