diff options
author | Soonil Nagarkar <sooniln@google.com> | 2021-01-11 11:04:58 -0800 |
---|---|---|
committer | Soonil Nagarkar <sooniln@google.com> | 2021-01-13 14:49:51 -0800 |
commit | dcb05abba8aa5cbe46737441c43c52182afb1b6d (patch) | |
tree | 144d1f64283d8f3fdf9e3f88068db793a7a04929 | |
parent | 96292972865297702b53ebb3ccb72c2d3592654c (diff) |
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
9 files changed, 65 insertions, 33 deletions
diff --git a/core/api/system-current.txt b/core/api/system-current.txt index 2dee86d6088e..027bd57ecc5c 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 afae50203cd3..65721cc33aed 100644 --- a/location/java/android/location/ILocationManager.aidl +++ b/location/java/android/location/ILocationManager.aidl @@ -78,21 +78,21 @@ interface ILocationManager @nullable List<GnssAntennaInfo> 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<String> 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<String> 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 2dc9eb44236f..059e6022f5bf 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, + @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 9dbdedeb8a03..0bb7dbb71ae8 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 12dc170413de..05561d79c3d5 100644 --- a/packages/FusedLocation/AndroidManifest.xml +++ b/packages/FusedLocation/AndroidManifest.xml @@ -27,6 +27,7 @@ <uses-permission android:name="android.permission.UPDATE_DEVICE_STATS" /> <uses-permission android:name="android.permission.INSTALL_LOCATION_PROVIDER" /> <uses-permission android:name="android.permission.INTERACT_ACROSS_USERS_FULL" /> + <uses-permission android:name="android.permission.UPDATE_APP_OPS_STATS" /> <application android:label="@string/app_label" diff --git a/packages/FusedLocation/src/com/android/location/fused/FusedLocationProvider.java b/packages/FusedLocation/src/com/android/location/fused/FusedLocationProvider.java index cb55c727809a..7a239af98755 100644 --- a/packages/FusedLocation/src/com/android/location/fused/FusedLocationProvider.java +++ b/packages/FusedLocation/src/com/android/location/fused/FusedLocationProvider.java @@ -273,6 +273,7 @@ public class FusedLocationProvider extends LocationProviderBase { .setLowPower(mRequest.isLowPower()) .setLocationSettingsIgnored(mRequest.isLocationSettingsIgnored()) .setWorkSource(mRequest.getWorkSource()) + .setHiddenFromAppOps(true) .build(); mLocationManager.requestLocationUpdates(mProvider, request, mContext.getMainExecutor(), this); diff --git a/packages/FusedLocation/test/AndroidManifest.xml b/packages/FusedLocation/test/AndroidManifest.xml index c00d15e726e4..c38cecb3dac3 100644 --- a/packages/FusedLocation/test/AndroidManifest.xml +++ b/packages/FusedLocation/test/AndroidManifest.xml @@ -9,6 +9,7 @@ <uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" /> <uses-permission android:name="android.permission.UPDATE_DEVICE_STATS" /> <uses-permission android:name="android.permission.READ_DEVICE_CONFIG" /> + <uses-permission android:name="android.permission.UPDATE_APP_OPS_STATS" /> <application android:label="FusedLocation Tests"> <uses-library android:name="android.test.runner" /> diff --git a/services/core/java/com/android/server/location/LocationManagerService.java b/services/core/java/com/android/server/location/LocationManagerService.java index e8052289cca4..acec84482fca 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 14f010063538..5daf13cb3e52 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); |