diff options
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(); |