Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e731ca89 authored by Soonil Nagarkar's avatar Soonil Nagarkar
Browse files

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
parent 20e5558d
Loading
Loading
Loading
Loading
+5 −12
Original line number Diff line number Diff line
@@ -541,7 +541,7 @@ public class LocationManagerService extends ILocationManager.Stub {
        }
    }

    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 @@ public class LocationManagerService extends ILocationManager.Stub {
        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 @@ public class LocationManagerService extends ILocationManager.Stub {
                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 @@ public class LocationManagerService extends ILocationManager.Stub {
                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 @@ public class LocationManagerService extends ILocationManager.Stub {
        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 @@ public class LocationManagerService extends ILocationManager.Stub {
                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 @@ public class LocationManagerService extends ILocationManager.Stub {
        }
        ActivityRecognitionProxy proxy = ActivityRecognitionProxy.createAndBind(
                mContext,
                mLocationHandler,
                activityRecognitionHardwareIsSupported,
                activityRecognitionHardware,
                com.android.internal.R.bool.config_enableActivityRecognitionHardwareOverlay,
Loading