summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--services/core/java/com/android/server/location/provider/LocationProviderManager.java14
-rw-r--r--services/tests/mockingservicestests/src/com/android/server/location/provider/LocationProviderManagerTest.java18
2 files changed, 28 insertions, 4 deletions
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 0be325fb6aa7..4b772f29e250 100644
--- a/services/core/java/com/android/server/location/provider/LocationProviderManager.java
+++ b/services/core/java/com/android/server/location/provider/LocationProviderManager.java
@@ -2271,22 +2271,28 @@ public class LocationProviderManager extends
}
if (mOnLocationTagsChangeListener != null) {
- if (!oldState.extraAttributionTags.equals(newState.extraAttributionTags)) {
+ if (!oldState.extraAttributionTags.equals(newState.extraAttributionTags)
+ || !Objects.equals(oldState.identity, newState.identity)) {
if (oldState.identity != null) {
FgThread.getHandler().sendMessage(PooledLambda.obtainMessage(
OnProviderLocationTagsChangeListener::onLocationTagsChanged,
mOnLocationTagsChangeListener, new LocationTagInfo(
oldState.identity.getUid(), oldState.identity.getPackageName(),
Collections.emptySet())
- ));
+ ));
}
if (newState.identity != null) {
+ ArraySet<String> attributionTags = new ArraySet<>(
+ newState.extraAttributionTags.size() + 1);
+ attributionTags.addAll(newState.extraAttributionTags);
+ attributionTags.add(newState.identity.getAttributionTag());
+
FgThread.getHandler().sendMessage(PooledLambda.obtainMessage(
OnProviderLocationTagsChangeListener::onLocationTagsChanged,
mOnLocationTagsChangeListener, new LocationTagInfo(
newState.identity.getUid(), newState.identity.getPackageName(),
- newState.extraAttributionTags)
- ));
+ attributionTags)
+ ));
}
}
}
diff --git a/services/tests/mockingservicestests/src/com/android/server/location/provider/LocationProviderManagerTest.java b/services/tests/mockingservicestests/src/com/android/server/location/provider/LocationProviderManagerTest.java
index 24b85f056731..92e4ec9d2e8b 100644
--- a/services/tests/mockingservicestests/src/com/android/server/location/provider/LocationProviderManagerTest.java
+++ b/services/tests/mockingservicestests/src/com/android/server/location/provider/LocationProviderManagerTest.java
@@ -61,6 +61,8 @@ import android.location.ILocationListener;
import android.location.LastLocationRequest;
import android.location.Location;
import android.location.LocationManagerInternal;
+import android.location.LocationManagerInternal.LocationTagInfo;
+import android.location.LocationManagerInternal.OnProviderLocationTagsChangeListener;
import android.location.LocationManagerInternal.ProviderEnabledListener;
import android.location.LocationRequest;
import android.location.LocationResult;
@@ -90,6 +92,7 @@ import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
+import org.mockito.ArgumentCaptor;
import org.mockito.InOrder;
import org.mockito.Mock;
@@ -216,6 +219,21 @@ public class LocationProviderManagerTest {
}
@Test
+ public void testAttributionTags() {
+ OnProviderLocationTagsChangeListener listener = mock(
+ OnProviderLocationTagsChangeListener.class);
+ mManager.setOnProviderLocationTagsChangeListener(listener);
+
+ mProvider.setExtraAttributionTags(Collections.singleton("extra"));
+
+ ArgumentCaptor<LocationTagInfo> captor = ArgumentCaptor.forClass(LocationTagInfo.class);
+ verify(listener, times(2)).onLocationTagsChanged(captor.capture());
+
+ assertThat(captor.getAllValues().get(0).getTags()).isEmpty();
+ assertThat(captor.getAllValues().get(1).getTags()).containsExactly("extra", "attribution");
+ }
+
+ @Test
public void testRemoveProvider() {
mManager.setRealProvider(null);
assertThat(mManager.hasProvider()).isFalse();