From dcb05abba8aa5cbe46737441c43c52182afb1b6d Mon Sep 17 00:00:00 2001 From: Soonil Nagarkar Date: Mon, 11 Jan 2021 11:04:58 -0800 Subject: [PATCH] Include attribution tag in identifying providers Expose provider identification methods that allow for attribution tag to be provided in addition to the package. Bug: 177239114 Test: manual Change-Id: Id0247a3f2a27f8d4897fd28644a34f783bd10d84 --- core/api/system-current.txt | 3 +- .../android/location/ILocationManager.aidl | 20 +++++----- .../android/location/LocationManager.java | 39 ++++++++++++++----- .../util/identity/CallerIdentity.java | 10 +++-- packages/FusedLocation/AndroidManifest.xml | 1 + .../location/fused/FusedLocationProvider.java | 1 + .../FusedLocation/test/AndroidManifest.xml | 1 + .../location/LocationManagerService.java | 22 +++++++---- .../provider/LocationProviderManager.java | 3 -- 9 files changed, 66 insertions(+), 34 deletions(-) diff --git a/core/api/system-current.txt b/core/api/system-current.txt index 2dee86d6088e5..027bd57ecc5c6 100644 --- a/core/api/system-current.txt +++ b/core/api/system-current.txt @@ -4320,7 +4320,8 @@ package android.location { method public boolean isLocationEnabledForUser(@NonNull android.os.UserHandle); method public boolean isProviderEnabledForUser(@NonNull String, @NonNull android.os.UserHandle); method @Deprecated @RequiresPermission(android.Manifest.permission.READ_DEVICE_CONFIG) public boolean isProviderPackage(@NonNull String); - method @RequiresPermission(android.Manifest.permission.READ_DEVICE_CONFIG) public boolean isProviderPackage(@Nullable String, @NonNull String); + method @Deprecated @RequiresPermission(android.Manifest.permission.READ_DEVICE_CONFIG) public boolean isProviderPackage(@Nullable String, @NonNull String); + method @RequiresPermission(android.Manifest.permission.READ_DEVICE_CONFIG) public boolean isProviderPackage(@Nullable String, @NonNull String, @Nullable String); method @Deprecated @RequiresPermission(allOf={android.Manifest.permission.LOCATION_HARDWARE, android.Manifest.permission.UPDATE_APP_OPS_STATS}) public boolean registerGnssBatchedLocationCallback(long, boolean, @NonNull android.location.BatchedLocationCallback, @Nullable android.os.Handler); method @Deprecated @RequiresPermission(android.Manifest.permission.ACCESS_FINE_LOCATION) public boolean registerGnssMeasurementsCallback(@NonNull android.location.GnssRequest, @NonNull java.util.concurrent.Executor, @NonNull android.location.GnssMeasurementsEvent.Callback); method @Deprecated @RequiresPermission(anyOf={android.Manifest.permission.ACCESS_COARSE_LOCATION, android.Manifest.permission.ACCESS_FINE_LOCATION}) public void requestLocationUpdates(@Nullable android.location.LocationRequest, @NonNull android.location.LocationListener, @Nullable android.os.Looper); diff --git a/location/java/android/location/ILocationManager.aidl b/location/java/android/location/ILocationManager.aidl index afae50203cd3b..65721cc33aedd 100644 --- a/location/java/android/location/ILocationManager.aidl +++ b/location/java/android/location/ILocationManager.aidl @@ -78,21 +78,21 @@ interface ILocationManager @nullable List getGnssAntennaInfos(); - void registerGnssStatusCallback(in IGnssStatusListener callback, String packageName, String attributionTag); + void registerGnssStatusCallback(in IGnssStatusListener callback, String packageName, @nullable String attributionTag); void unregisterGnssStatusCallback(in IGnssStatusListener callback); - void registerGnssNmeaCallback(in IGnssNmeaListener callback, String packageName, String attributionTag); + void registerGnssNmeaCallback(in IGnssNmeaListener callback, String packageName, @nullable String attributionTag); void unregisterGnssNmeaCallback(in IGnssNmeaListener callback); - void addGnssMeasurementsListener(in GnssMeasurementRequest request, in IGnssMeasurementsListener listener, String packageName, String attributionTag); + void addGnssMeasurementsListener(in GnssMeasurementRequest request, in IGnssMeasurementsListener listener, String packageName, @nullable String attributionTag); void removeGnssMeasurementsListener(in IGnssMeasurementsListener listener); void injectGnssMeasurementCorrections(in GnssMeasurementCorrections corrections); - void addGnssNavigationMessageListener(in IGnssNavigationMessageListener listener, String packageName, String attributionTag); + void addGnssNavigationMessageListener(in IGnssNavigationMessageListener listener, String packageName, @nullable String attributionTag); void removeGnssNavigationMessageListener(in IGnssNavigationMessageListener listener); int getGnssBatchSize(); - void startGnssBatch(long periodNanos, in ILocationListener listener, String packageName, String attributionTag, String listenerId); + void startGnssBatch(long periodNanos, in ILocationListener listener, String packageName, @nullable String attributionTag, @nullable String listenerId); void flushGnssBatch(); void stopGnssBatch(); @@ -101,7 +101,7 @@ interface ILocationManager List getProviders(in Criteria criteria, boolean enabledOnly); String getBestProvider(in Criteria criteria, boolean enabledOnly); ProviderProperties getProviderProperties(String provider); - boolean isProviderPackage(String provider, String packageName); + boolean isProviderPackage(@nullable String provider, String packageName, @nullable String attributionTag); List getProviderPackages(String provider); void setExtraLocationControllerPackage(String packageName); @@ -113,10 +113,10 @@ interface ILocationManager boolean isLocationEnabledForUser(int userId); void setLocationEnabledForUser(boolean enabled, int userId); - void addTestProvider(String name, in ProviderProperties properties, String packageName, String attributionTag); - void removeTestProvider(String provider, String packageName, String attributionTag); - void setTestProviderLocation(String provider, in Location location, String packageName, String attributionTag); - void setTestProviderEnabled(String provider, boolean enabled, String packageName, String attributionTag); + void addTestProvider(String name, in ProviderProperties properties, String packageName, @nullable String attributionTag); + void removeTestProvider(String provider, String packageName, @nullable String attributionTag); + void setTestProviderLocation(String provider, in Location location, String packageName, @nullable String attributionTag); + void setTestProviderEnabled(String provider, boolean enabled, String packageName, @nullable String attributionTag); LocationTime getGnssTimeMillis(); diff --git a/location/java/android/location/LocationManager.java b/location/java/android/location/LocationManager.java index 2dc9eb44236f5..059e6022f5bf5 100644 --- a/location/java/android/location/LocationManager.java +++ b/location/java/android/location/LocationManager.java @@ -72,6 +72,7 @@ import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.List; +import java.util.Objects; import java.util.WeakHashMap; import java.util.concurrent.Executor; import java.util.function.Consumer; @@ -1840,17 +1841,13 @@ public class LocationManager { * otherwise. * * @hide - * @deprecated Prefer {@link #isProviderPackage(String, String)} instead. + * @deprecated Prefer {@link #isProviderPackage(String, String, String)} instead. */ @Deprecated @SystemApi @RequiresPermission(Manifest.permission.READ_DEVICE_CONFIG) public boolean isProviderPackage(@NonNull String packageName) { - try { - return mService.isProviderPackage(null, packageName); - } catch (RemoteException e) { - throw e.rethrowFromSystemServer(); - } + return isProviderPackage(null, packageName, null); } /** @@ -1861,13 +1858,37 @@ public class LocationManager { * @param provider a provider listed by {@link #getAllProviders()} or null * @param packageName the package name to test if it is a provider * @return true if the given arguments correspond to a provider + * + * @deprecated Use {@link #isProviderPackage(String, String, String)} instead. + * + * @hide + */ + @Deprecated + @SystemApi + @RequiresPermission(Manifest.permission.READ_DEVICE_CONFIG) + public boolean isProviderPackage(@Nullable String provider, @NonNull String packageName) { + return isProviderPackage(provider, packageName, null); + } + + /** + * Returns true if the given provider corresponds to the given package name. If the given + * provider is null, this will return true if any provider corresponds to the given package + * name and/or attribution tag. If attribution tag is non-null, the provider identity must match + * both the given package name and attribution tag. + * + * @param provider a provider listed by {@link #getAllProviders()} or null + * @param packageName the package name to test if it is a provider + * @param attributionTag an optional attribution tag within the given package + * @return true if the given arguments correspond to a provider * @hide */ @SystemApi @RequiresPermission(Manifest.permission.READ_DEVICE_CONFIG) - public boolean isProviderPackage(@Nullable String provider, @NonNull String packageName) { + public boolean isProviderPackage(@Nullable String provider, @NonNull String packageName, + @Nullable String attributionTag) { try { - return mService.isProviderPackage(provider, packageName); + return mService.isProviderPackage(provider, Objects.requireNonNull(packageName), + attributionTag); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } @@ -1878,7 +1899,7 @@ public class LocationManager { * and an empty list if no package is associated with the provider. * * @hide - * @deprecated Prefer {@link #isProviderPackage(String, String)} instead. + * @deprecated Prefer {@link #isProviderPackage(String, String, String)} instead. */ @TestApi @Deprecated diff --git a/location/java/android/location/util/identity/CallerIdentity.java b/location/java/android/location/util/identity/CallerIdentity.java index 9dbdedeb8a030..0bb7dbb71ae8b 100644 --- a/location/java/android/location/util/identity/CallerIdentity.java +++ b/location/java/android/location/util/identity/CallerIdentity.java @@ -201,11 +201,15 @@ public final class CallerIdentity { return false; } CallerIdentity that = (CallerIdentity) o; - return mUid == that.mUid + return equalsIgnoringListenerId(that) && Objects.equals(mListenerId, that.mListenerId); + } + + public boolean equalsIgnoringListenerId(CallerIdentity that) { + return that != null + && mUid == that.mUid && mPid == that.mPid && mPackageName.equals(that.mPackageName) - && Objects.equals(mAttributionTag, that.mAttributionTag) - && Objects.equals(mListenerId, that.mListenerId); + && Objects.equals(mAttributionTag, that.mAttributionTag); } @Override diff --git a/packages/FusedLocation/AndroidManifest.xml b/packages/FusedLocation/AndroidManifest.xml index 12dc170413dee..05561d79c3d50 100644 --- a/packages/FusedLocation/AndroidManifest.xml +++ b/packages/FusedLocation/AndroidManifest.xml @@ -27,6 +27,7 @@ + + diff --git a/services/core/java/com/android/server/location/LocationManagerService.java b/services/core/java/com/android/server/location/LocationManagerService.java index e8052289cca48..acec84482fca4 100644 --- a/services/core/java/com/android/server/location/LocationManagerService.java +++ b/services/core/java/com/android/server/location/LocationManagerService.java @@ -964,7 +964,8 @@ public class LocationManagerService extends ILocationManager.Stub { } @Override - public boolean isProviderPackage(String provider, String packageName) { + public boolean isProviderPackage(@Nullable String provider, String packageName, + @Nullable String attributionTag) { mContext.enforceCallingOrSelfPermission(permission.READ_DEVICE_CONFIG, null); for (LocationProviderManager manager : mProviderManagers) { @@ -975,7 +976,8 @@ public class LocationManagerService extends ILocationManager.Stub { if (identity == null) { continue; } - if (identity.getPackageName().equals(packageName)) { + if (identity.getPackageName().equals(packageName) && (attributionTag == null + || Objects.equals(identity.getAttributionTag(), attributionTag))) { return true; } } @@ -1277,13 +1279,17 @@ public class LocationManagerService extends ILocationManager.Stub { } @Override - public boolean isProvider(String provider, CallerIdentity identity) { - LocationProviderManager manager = getLocationProviderManager(provider); - if (manager == null) { - return false; - } else { - return identity.equals(manager.getIdentity()); + public boolean isProvider(@Nullable String provider, CallerIdentity identity) { + for (LocationProviderManager manager : mProviderManagers) { + if (provider != null && !provider.equals(manager.getName())) { + continue; + } + if (identity.equalsIgnoringListenerId(manager.getIdentity())) { + return true; + } } + + return false; } @Override diff --git a/services/core/java/com/android/server/location/provider/LocationProviderManager.java b/services/core/java/com/android/server/location/provider/LocationProviderManager.java index 14f010063538a..5daf13cb3e528 100644 --- a/services/core/java/com/android/server/location/provider/LocationProviderManager.java +++ b/services/core/java/com/android/server/location/provider/LocationProviderManager.java @@ -1322,9 +1322,6 @@ public class LocationProviderManager extends Binder.restoreCallingIdentity(identity); } - setRealProvider(null); - setMockProvider(null); - mUserHelper.removeListener(mUserChangedListener); mSettingsHelper.removeOnLocationEnabledChangedListener(mLocationEnabledChangedListener);