Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 3a955805 authored by Soonil Nagarkar's avatar Soonil Nagarkar
Browse files

Include provider tag in complete attribution tag list

Ensure that the list of attribution tags considered "producer" or "source"
includes the attribution tag of the location provider itself. This is
particularily important if the location provider does not use any
attribution tags, as this ensures the null tag is included in the list.

Bug: 186572461
Test: manual
Change-Id: I9a7b2e9b67cbeb700d5c04730541ad4bf051d0da
parent 2d41f532
Loading
Loading
Loading
Loading
+10 −4
Original line number Diff line number Diff line
@@ -2271,7 +2271,8 @@ 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,
@@ -2281,11 +2282,16 @@ public class LocationProviderManager extends
                    ));
                }
                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)
                    ));
                }
            }
+18 −0
Original line number Diff line number Diff line
@@ -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;

@@ -215,6 +218,21 @@ public class LocationProviderManagerTest {
        assertThat(mManager.hasProvider()).isFalse();
    }

    @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);