summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSoonil Nagarkar <sooniln@google.com>2021-01-11 11:04:58 -0800
committerSoonil Nagarkar <sooniln@google.com>2021-01-13 14:49:51 -0800
commitdcb05abba8aa5cbe46737441c43c52182afb1b6d (patch)
tree144d1f64283d8f3fdf9e3f88068db793a7a04929
parent96292972865297702b53ebb3ccb72c2d3592654c (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
-rw-r--r--core/api/system-current.txt3
-rw-r--r--location/java/android/location/ILocationManager.aidl20
-rw-r--r--location/java/android/location/LocationManager.java37
-rw-r--r--location/java/android/location/util/identity/CallerIdentity.java10
-rw-r--r--packages/FusedLocation/AndroidManifest.xml1
-rw-r--r--packages/FusedLocation/src/com/android/location/fused/FusedLocationProvider.java1
-rw-r--r--packages/FusedLocation/test/AndroidManifest.xml1
-rw-r--r--services/core/java/com/android/server/location/LocationManagerService.java22
-rw-r--r--services/core/java/com/android/server/location/provider/LocationProviderManager.java3
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);