diff options
14 files changed, 178 insertions, 115 deletions
diff --git a/location/java/android/location/LocationManager.java b/location/java/android/location/LocationManager.java index f88ddb8034b6..e73e915bf88b 100644 --- a/location/java/android/location/LocationManager.java +++ b/location/java/android/location/LocationManager.java @@ -1943,7 +1943,7 @@ public class LocationManager { * * @param provider the provider name * @param properties the provider properties - * @param locationTags the attribution tags for accessing location from the provider + * @param extraAttributionTags additional attribution tags associated with this provider * * @throws IllegalArgumentException if provider is null * @throws IllegalArgumentException if properties is null @@ -1952,13 +1952,14 @@ public class LocationManager { * allowed} for your app. */ public void addTestProvider(@NonNull String provider, @NonNull ProviderProperties properties, - @NonNull Set<String> locationTags) { + @NonNull Set<String> extraAttributionTags) { Preconditions.checkArgument(provider != null, "invalid null provider"); Preconditions.checkArgument(properties != null, "invalid null properties"); - Preconditions.checkArgument(locationTags != null, "invalid null location tags"); + Preconditions.checkArgument(extraAttributionTags != null, + "invalid null extra attribution tags"); try { - mService.addTestProvider(provider, properties, new ArrayList<>(locationTags), + mService.addTestProvider(provider, properties, new ArrayList<>(extraAttributionTags), mContext.getOpPackageName(), mContext.getFeatureId()); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); diff --git a/services/core/java/com/android/server/location/LocationManagerService.java b/services/core/java/com/android/server/location/LocationManagerService.java index cdaffb757311..2920ddb2d76d 100644 --- a/services/core/java/com/android/server/location/LocationManagerService.java +++ b/services/core/java/com/android/server/location/LocationManagerService.java @@ -464,7 +464,7 @@ public class LocationManagerService extends ILocationManager.Stub { .build(); final LocationProviderManager manager = getOrAddLocationProviderManager(name); manager.setMockProvider(new MockLocationProvider(properties, - CallerIdentity.fromContext(mContext), /*locationTags*/ null)); + CallerIdentity.fromContext(mContext), Collections.emptySet())); } } @@ -1170,7 +1170,7 @@ public class LocationManagerService extends ILocationManager.Stub { @Override public void addTestProvider(String provider, ProviderProperties properties, - List<String> locationTags, String packageName, String attributionTag) { + List<String> extraAttributionTags, String packageName, String attributionTag) { // unsafe is ok because app ops will verify the package name CallerIdentity identity = CallerIdentity.fromBinderUnsafe(packageName, attributionTag); if (!mInjector.getAppOpsHelper().noteOp(AppOpsManager.OP_MOCK_LOCATION, identity)) { @@ -1179,7 +1179,7 @@ public class LocationManagerService extends ILocationManager.Stub { final LocationProviderManager manager = getOrAddLocationProviderManager(provider); manager.setMockProvider(new MockLocationProvider(properties, identity, - (locationTags != null) ? new ArraySet<>(locationTags) : null)); + new ArraySet<>(extraAttributionTags))); } @Override diff --git a/services/core/java/com/android/server/location/LocationShellCommand.java b/services/core/java/com/android/server/location/LocationShellCommand.java index 21a9b0442b74..5dc3ed8c47bd 100644 --- a/services/core/java/com/android/server/location/LocationShellCommand.java +++ b/services/core/java/com/android/server/location/LocationShellCommand.java @@ -26,6 +26,8 @@ import com.android.modules.utils.BasicShellCommandHandler; import java.io.PrintWriter; import java.util.Arrays; +import java.util.Collections; +import java.util.List; import java.util.Objects; /** @@ -50,15 +52,11 @@ class LocationShellCommand extends BasicShellCommandHandler { switch (cmd) { case "is-location-enabled": { - int userId = parseUserId(); - boolean enabled = mService.isLocationEnabledForUser(userId); - getOutPrintWriter().println(enabled); + handleIsLocationEnabled(); return 0; } case "set-location-enabled": { - int userId = parseUserId(); - boolean enabled = Boolean.parseBoolean(getNextArgRequired()); - mService.setLocationEnabledForUser(enabled, userId); + handleSetLocationEnabled(); return 0; } case "providers": { @@ -73,36 +71,23 @@ class LocationShellCommand extends BasicShellCommandHandler { private int parseProvidersCommand(String cmd) { switch (cmd) { case "add-test-provider": { - String provider = getNextArgRequired(); - ProviderProperties properties = parseTestProviderProviderProperties(); - mService.addTestProvider(provider, properties, /*locationTags*/ null, - mContext.getOpPackageName(), mContext.getFeatureId()); + handleAddTestProvider(); return 0; } case "remove-test-provider": { - String provider = getNextArgRequired(); - mService.removeTestProvider(provider, mContext.getOpPackageName(), - mContext.getFeatureId()); + handleRemoveTestProvider(); return 0; } case "set-test-provider-enabled": { - String provider = getNextArgRequired(); - boolean enabled = Boolean.parseBoolean(getNextArgRequired()); - mService.setTestProviderEnabled(provider, enabled, mContext.getOpPackageName(), - mContext.getFeatureId()); + handleSetTestProviderEnabled(); return 0; } case "set-test-provider-location": { - String provider = getNextArgRequired(); - Location location = parseTestProviderLocation(provider); - mService.setTestProviderLocation(provider, location, mContext.getOpPackageName(), - mContext.getFeatureId()); + handleSetTestProviderLocation(); return 0; } case "send-extra-command": { - String provider = getNextArgRequired(); - String command = getNextArgRequired(); - mService.sendExtraCommand(provider, command, null); + handleSendExtraCommand(); return 0; } default: @@ -110,21 +95,47 @@ class LocationShellCommand extends BasicShellCommandHandler { } } - private int parseUserId() { - final String option = getNextOption(); - if (option != null) { - if (option.equals("--user")) { - return UserHandle.parseUserArg(getNextArgRequired()); + private void handleIsLocationEnabled() { + int userId = UserHandle.USER_CURRENT_OR_SELF; + + do { + String option = getNextOption(); + if (option == null) { + break; + } + if ("--user".equals(option)) { + userId = UserHandle.parseUserArg(getNextArgRequired()); } else { - throw new IllegalArgumentException( - "Expected \"--user\" option, but got \"" + option + "\" instead"); + throw new IllegalArgumentException("Unknown option: " + option); } - } + } while (true); - return UserHandle.USER_CURRENT_OR_SELF; + getOutPrintWriter().println(mService.isLocationEnabledForUser(userId)); } - private ProviderProperties parseTestProviderProviderProperties() { + private void handleSetLocationEnabled() { + boolean enabled = Boolean.parseBoolean(getNextArgRequired()); + + int userId = UserHandle.USER_CURRENT_OR_SELF; + + do { + String option = getNextOption(); + if (option == null) { + break; + } + if ("--user".equals(option)) { + userId = UserHandle.parseUserArg(getNextArgRequired()); + } else { + throw new IllegalArgumentException("Unknown option: " + option); + } + } while (true); + + mService.setLocationEnabledForUser(enabled, userId); + } + + private void handleAddTestProvider() { + String provider = getNextArgRequired(); + boolean requiresNetwork = false; boolean requiresSatellite = false; boolean requiresCell = false; @@ -135,8 +146,13 @@ class LocationShellCommand extends BasicShellCommandHandler { int powerRequirement = Criteria.POWER_LOW; int accuracy = Criteria.ACCURACY_FINE; - String option = getNextOption(); - while (option != null) { + List<String> extraAttributionTags = Collections.emptyList(); + + do { + String option = getNextOption(); + if (option == null) { + break; + } switch (option) { case "--requiresNetwork": { requiresNetwork = true; @@ -174,12 +190,15 @@ class LocationShellCommand extends BasicShellCommandHandler { accuracy = Integer.parseInt(getNextArgRequired()); break; } + case "--extraAttributionTags": { + extraAttributionTags = Arrays.asList(getNextArgRequired().split(",")); + break; + } default: throw new IllegalArgumentException( "Received unexpected option: " + option); } - option = getNextOption(); - } + } while(true); ProviderProperties properties = new ProviderProperties.Builder() .setHasNetworkRequirement(requiresNetwork) @@ -192,30 +211,50 @@ class LocationShellCommand extends BasicShellCommandHandler { .setPowerUsage(powerRequirement) .setAccuracy(accuracy) .build(); + mService.addTestProvider(provider, properties, extraAttributionTags, + mContext.getOpPackageName(), mContext.getAttributionTag()); + } - return properties; + private void handleRemoveTestProvider() { + String provider = getNextArgRequired(); + mService.removeTestProvider(provider, mContext.getOpPackageName(), + mContext.getAttributionTag()); } - private Location parseTestProviderLocation(String provider) { - boolean hasLatitude = false; - boolean hasLongitude = false; + private void handleSetTestProviderEnabled() { + String provider = getNextArgRequired(); + boolean enabled = Boolean.parseBoolean(getNextArgRequired()); + mService.setTestProviderEnabled(provider, enabled, mContext.getOpPackageName(), + mContext.getAttributionTag()); + } + + private void handleSetTestProviderLocation() { + String provider = getNextArgRequired(); + + boolean hasLatLng = false; Location location = new Location(provider); location.setAccuracy(DEFAULT_TEST_LOCATION_ACCURACY); location.setTime(System.currentTimeMillis()); + location.setElapsedRealtimeNanos(System.nanoTime()); - String option = getNextOption(); - while (option != null) { + do { + String option = getNextOption(); + if (option == null) { + break; + } switch (option) { case "--location": { String[] locationInput = getNextArgRequired().split(","); if (locationInput.length != 2) { - throw new IllegalArgumentException( - "Unexpected location format: " + Arrays.toString(locationInput)); + throw new IllegalArgumentException("Location argument must be in the form " + + "of \"<LATITUDE>,<LONGITUDE>\", not " + + Arrays.toString(locationInput)); } location.setLatitude(Double.parseDouble(locationInput[0])); location.setLongitude(Double.parseDouble(locationInput[1])); + hasLatLng = true; break; } case "--accuracy": { @@ -227,15 +266,22 @@ class LocationShellCommand extends BasicShellCommandHandler { break; } default: - throw new IllegalArgumentException( - "Received unexpected option: " + option); + throw new IllegalArgumentException("Unknown option: " + option); } - option = getNextOption(); + } while (true); + + if (!hasLatLng) { + throw new IllegalArgumentException("Option \"--location\" is required"); } - location.setElapsedRealtimeNanos(System.nanoTime()); + mService.setTestProviderLocation(provider, location, mContext.getOpPackageName(), + mContext.getAttributionTag()); + } - return location; + private void handleSendExtraCommand() { + String provider = getNextArgRequired(); + String command = getNextArgRequired(); + mService.sendExtraCommand(provider, command, null); } @Override @@ -245,24 +291,29 @@ class LocationShellCommand extends BasicShellCommandHandler { pw.println(" help or -h"); pw.println(" Print this help text."); pw.println(" is-location-enabled [--user <USER_ID>]"); - pw.println(" Gets the master location switch enabled state."); - pw.println(" set-location-enabled [--user <USER_ID>] true|false"); - pw.println(" Sets the master location switch enabled state."); + pw.println(" Gets the master location switch enabled state. If no user is specified,"); + pw.println(" the current user is assumed."); + pw.println(" set-location-enabled true|false [--user <USER_ID>]"); + pw.println(" Sets the master location switch enabled state. If no user is specified,"); + pw.println(" the current user is assumed."); pw.println(" providers"); + pw.println(" The providers command is followed by a subcommand, as listed below:"); + pw.println(); pw.println(" add-test-provider <PROVIDER> [--requiresNetwork] [--requiresSatellite]"); pw.println(" [--requiresCell] [--hasMonetaryCost] [--supportsAltitude]"); pw.println(" [--supportsSpeed] [--supportsBearing]"); pw.println(" [--powerRequirement <POWER_REQUIREMENT>]"); + pw.println(" [--extraAttributionTags <TAG>,<TAG>,...]"); pw.println(" Add the given test provider. Requires MOCK_LOCATION permissions which"); pw.println(" can be enabled by running \"adb shell appops set <uid>"); pw.println(" android:mock_location allow\". There are optional flags that can be"); - pw.println(" used to configure the provider properties. If no flags are included,"); - pw.println(" then default values will be used."); + pw.println(" used to configure the provider properties and additional arguments. If"); + pw.println(" no flags are included, then default values will be used."); pw.println(" remove-test-provider <PROVIDER>"); pw.println(" Remove the given test provider."); pw.println(" set-test-provider-enabled <PROVIDER> true|false"); pw.println(" Sets the given test provider enabled state."); - pw.println(" set-test-provider-location <PROVIDER> [--location <LATITUDE>,<LONGITUDE>]"); + pw.println(" set-test-provider-location <PROVIDER> --location <LATITUDE>,<LONGITUDE>"); pw.println(" [--accuracy <ACCURACY>] [--time <TIME>]"); pw.println(" Set location for given test provider. Accuracy and time are optional."); pw.println(" send-extra-command <PROVIDER> <COMMAND>"); diff --git a/services/core/java/com/android/server/location/gnss/GnssLocationProvider.java b/services/core/java/com/android/server/location/gnss/GnssLocationProvider.java index 29da177ee4a1..1df29ab5791f 100644 --- a/services/core/java/com/android/server/location/gnss/GnssLocationProvider.java +++ b/services/core/java/com/android/server/location/gnss/GnssLocationProvider.java @@ -103,6 +103,7 @@ import com.android.server.location.provider.AbstractLocationProvider; import java.io.FileDescriptor; import java.io.PrintWriter; import java.util.ArrayList; +import java.util.Collections; import java.util.HashSet; import java.util.List; import java.util.Objects; @@ -372,7 +373,7 @@ public class GnssLocationProvider extends AbstractLocationProvider implements public GnssLocationProvider(Context context, Injector injector, GnssNative gnssNative, GnssMetrics gnssMetrics) { super(FgThread.getExecutor(), CallerIdentity.fromContext(context), PROPERTIES, - /*locationTags*/ null); + Collections.emptySet()); mContext = context; mGnssNative = gnssNative; diff --git a/services/core/java/com/android/server/location/provider/AbstractLocationProvider.java b/services/core/java/com/android/server/location/provider/AbstractLocationProvider.java index 9ff6e6bc8e32..ba7f44f2818b 100644 --- a/services/core/java/com/android/server/location/provider/AbstractLocationProvider.java +++ b/services/core/java/com/android/server/location/provider/AbstractLocationProvider.java @@ -28,6 +28,7 @@ import com.android.internal.util.Preconditions; import java.io.FileDescriptor; import java.io.PrintWriter; +import java.util.Collections; import java.util.Objects; import java.util.Set; import java.util.concurrent.Executor; @@ -66,9 +67,10 @@ public abstract class AbstractLocationProvider { /** * Default state value for a location provider that is disabled with no properties and an - * empty provider package list. + * empty extra attribution tag set. */ - public static final State EMPTY_STATE = new State(false, null, null, null); + public static final State EMPTY_STATE = new State(false, null, null, + Collections.emptySet()); /** * The provider's allowed state. @@ -85,14 +87,18 @@ public abstract class AbstractLocationProvider { */ @Nullable public final CallerIdentity identity; - @Nullable public final Set<String> locationTags; + /** + * A set of attribution tags also associated with this provider - these attribution tags may + * be afforded special privileges. + */ + public final Set<String> extraAttributionTags; private State(boolean allowed, ProviderProperties properties, CallerIdentity identity, - Set<String> locationTags) { + Set<String> extraAttributionTags) { this.allowed = allowed; this.properties = properties; this.identity = identity; - this.locationTags = locationTags; + this.extraAttributionTags = Objects.requireNonNull(extraAttributionTags); } /** @@ -102,7 +108,7 @@ public abstract class AbstractLocationProvider { if (allowed == this.allowed) { return this; } else { - return new State(allowed, properties, identity, locationTags); + return new State(allowed, properties, identity, extraAttributionTags); } } @@ -113,7 +119,7 @@ public abstract class AbstractLocationProvider { if (Objects.equals(properties, this.properties)) { return this; } else { - return new State(allowed, properties, identity, locationTags); + return new State(allowed, properties, identity, extraAttributionTags); } } @@ -124,18 +130,18 @@ public abstract class AbstractLocationProvider { if (Objects.equals(identity, this.identity)) { return this; } else { - return new State(allowed, properties, identity, locationTags); + return new State(allowed, properties, identity, extraAttributionTags); } } /** - * Returns a state the same as the current but with location tags set as specified. + * Returns a state the same as the current but with extra attribution tags set as specified. */ - public State withLocationTags(@Nullable Set<String> locationTags) { - if (Objects.equals(locationTags, this.locationTags)) { + public State withExtraAttributionTags(Set<String> extraAttributionTags) { + if (extraAttributionTags.equals(this.extraAttributionTags)) { return this; } else { - return new State(allowed, properties, identity, locationTags); + return new State(allowed, properties, identity, extraAttributionTags); } } @@ -151,12 +157,12 @@ public abstract class AbstractLocationProvider { State state = (State) o; return allowed == state.allowed && properties == state.properties && Objects.equals(identity, state.identity) - && Objects.equals(locationTags, state.locationTags); + && extraAttributionTags.equals(state.extraAttributionTags); } @Override public int hashCode() { - return Objects.hash(allowed, properties, identity, locationTags); + return Objects.hash(allowed, properties, identity, extraAttributionTags); } } @@ -213,14 +219,14 @@ public abstract class AbstractLocationProvider { * An optional identity and properties may be provided to initialize the location provider. */ protected AbstractLocationProvider(Executor executor, @Nullable CallerIdentity identity, - @Nullable ProviderProperties properties, @Nullable Set<String> locationTags) { + @Nullable ProviderProperties properties, Set<String> extraAttributionTags) { Preconditions.checkArgument(identity == null || identity.getListenerId() == null); - mExecutor = executor; + mExecutor = Objects.requireNonNull(executor); mInternalState = new AtomicReference<>(new InternalState(null, State.EMPTY_STATE .withIdentity(identity) - .withProperties(properties).withLocationTags(locationTags)) - ); + .withProperties(properties) + .withExtraAttributionTags(extraAttributionTags))); mController = new Controller(); } @@ -292,7 +298,7 @@ public abstract class AbstractLocationProvider { } /** - * Call this method to report a change in provider packages. + * Call this method to report a change in the provider's identity. */ protected void setIdentity(@Nullable CallerIdentity identity) { Preconditions.checkArgument(identity == null || identity.getListenerId() == null); @@ -300,10 +306,10 @@ public abstract class AbstractLocationProvider { } /** - * Call this method to report a change in provider location tags. + * Call this method to report a change in the provider's extra attribution tags. */ - protected void setLocationTags(@Nullable Set<String> locationTags) { - setState(state -> state.withLocationTags(locationTags)); + protected void setExtraAttributionTags(Set<String> extraAttributionTags) { + setState(state -> state.withExtraAttributionTags(extraAttributionTags)); } /** diff --git a/services/core/java/com/android/server/location/provider/DelegateLocationProvider.java b/services/core/java/com/android/server/location/provider/DelegateLocationProvider.java index 49f6e64a1e0c..423f833bf7e0 100644 --- a/services/core/java/com/android/server/location/provider/DelegateLocationProvider.java +++ b/services/core/java/com/android/server/location/provider/DelegateLocationProvider.java @@ -24,6 +24,7 @@ import com.android.internal.util.Preconditions; import java.io.FileDescriptor; import java.io.PrintWriter; +import java.util.Collections; import java.util.concurrent.Executor; /** @@ -40,7 +41,7 @@ class DelegateLocationProvider extends AbstractLocationProvider private boolean mInitialized = false; DelegateLocationProvider(Executor executor, AbstractLocationProvider delegate) { - super(executor, null, null, null); + super(executor, null, null, Collections.emptySet()); mDelegate = delegate; } 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 1ecf3ee40a53..fef30f9ea811 100644 --- a/services/core/java/com/android/server/location/provider/LocationProviderManager.java +++ b/services/core/java/com/android/server/location/provider/LocationProviderManager.java @@ -2265,8 +2265,8 @@ public class LocationProviderManager extends onEnabledChanged(UserHandle.USER_ALL); } - if (!Objects.equals(oldState.locationTags, newState.locationTags)) { - if (mOnLocationTagsChangeListener != null) { + if (mOnLocationTagsChangeListener != null) { + if (!oldState.extraAttributionTags.equals(newState.extraAttributionTags)) { if (oldState.identity != null) { FgThread.getHandler().sendMessage(PooledLambda.obtainMessage( OnProviderLocationTagsChangeListener::onLocationTagsChanged, @@ -2280,7 +2280,7 @@ public class LocationProviderManager extends OnProviderLocationTagsChangeListener::onLocationTagsChanged, mOnLocationTagsChangeListener, new LocationTagInfo( newState.identity.getUid(), newState.identity.getPackageName(), - newState.locationTags) + newState.extraAttributionTags) )); } } diff --git a/services/core/java/com/android/server/location/provider/MockLocationProvider.java b/services/core/java/com/android/server/location/provider/MockLocationProvider.java index 7660f56f1580..52b04d4bab14 100644 --- a/services/core/java/com/android/server/location/provider/MockLocationProvider.java +++ b/services/core/java/com/android/server/location/provider/MockLocationProvider.java @@ -40,9 +40,9 @@ public class MockLocationProvider extends AbstractLocationProvider { @Nullable private Location mLocation; public MockLocationProvider(ProviderProperties properties, CallerIdentity identity, - @Nullable Set<String> locationTags) { + Set<String> extraAttributionTags) { // using a direct executor is ok because this class has no locks that could deadlock - super(DIRECT_EXECUTOR, identity, properties, locationTags); + super(DIRECT_EXECUTOR, identity, properties, extraAttributionTags); } /** Sets the allowed state of this mock provider. */ diff --git a/services/core/java/com/android/server/location/provider/MockableLocationProvider.java b/services/core/java/com/android/server/location/provider/MockableLocationProvider.java index 4ffa9a509a23..81936440f6a7 100644 --- a/services/core/java/com/android/server/location/provider/MockableLocationProvider.java +++ b/services/core/java/com/android/server/location/provider/MockableLocationProvider.java @@ -31,6 +31,7 @@ import com.android.internal.util.Preconditions; import java.io.FileDescriptor; import java.io.PrintWriter; +import java.util.Collections; /** * Represents a location provider that may switch between a mock implementation and a real @@ -75,7 +76,7 @@ public class MockableLocationProvider extends AbstractLocationProvider { public MockableLocationProvider(Object ownerLock) { // using a direct executor is acceptable because all inbound calls are delegated to the // actual provider implementations which will use their own executors - super(DIRECT_EXECUTOR, null, null, null); + super(DIRECT_EXECUTOR, null, null, Collections.emptySet()); mOwnerLock = ownerLock; mRequest = ProviderRequest.EMPTY_REQUEST; } diff --git a/services/core/java/com/android/server/location/provider/PassiveLocationProvider.java b/services/core/java/com/android/server/location/provider/PassiveLocationProvider.java index ee9d35d21798..68ede88c6a4a 100644 --- a/services/core/java/com/android/server/location/provider/PassiveLocationProvider.java +++ b/services/core/java/com/android/server/location/provider/PassiveLocationProvider.java @@ -30,6 +30,7 @@ import android.os.Bundle; import java.io.FileDescriptor; import java.io.PrintWriter; +import java.util.Collections; /** * A passive location provider reports locations received from other providers @@ -48,7 +49,7 @@ public class PassiveLocationProvider extends AbstractLocationProvider { public PassiveLocationProvider(Context context) { // using a direct executor is ok because this class has no locks that could deadlock super(DIRECT_EXECUTOR, CallerIdentity.fromContext(context), PROPERTIES, - /*locationTags*/ null); + Collections.emptySet()); setAllowed(true); } diff --git a/services/core/java/com/android/server/location/provider/proxy/ProxyLocationProvider.java b/services/core/java/com/android/server/location/provider/proxy/ProxyLocationProvider.java index f00478a3488a..44b62b3659dc 100644 --- a/services/core/java/com/android/server/location/provider/proxy/ProxyLocationProvider.java +++ b/services/core/java/com/android/server/location/provider/proxy/ProxyLocationProvider.java @@ -18,7 +18,6 @@ package com.android.server.location.provider.proxy; import static com.android.internal.util.ConcurrentUtils.DIRECT_EXECUTOR; -import android.annotation.NonNull; import android.annotation.Nullable; import android.content.ComponentName; import android.content.Context; @@ -44,6 +43,7 @@ import com.android.server.location.provider.AbstractLocationProvider; import java.io.FileDescriptor; import java.io.PrintWriter; import java.util.ArrayList; +import java.util.Collections; import java.util.List; import java.util.Objects; @@ -52,8 +52,8 @@ import java.util.Objects; */ public class ProxyLocationProvider extends AbstractLocationProvider { - private static final String KEY_LOCATION_TAGS = "android:location_allow_listed_tags"; - private static final String LOCATION_TAGS_SEPARATOR = ";"; + private static final String KEY_EXTRA_ATTRIBUTION_TAGS = "android:location_allow_listed_tags"; + private static final String EXTRA_ATTRIBUTION_TAGS_SEPARATOR = ";"; /** * Creates and registers this proxy. If no suitable service is available for the proxy, returns @@ -90,7 +90,7 @@ public class ProxyLocationProvider extends AbstractLocationProvider { int nonOverlayPackageResId) { // safe to use direct executor since our locks are not acquired in a code path invoked by // our owning provider - super(DIRECT_EXECUTOR, null, null, null); + super(DIRECT_EXECUTOR, null, null, Collections.emptySet()); mContext = context; mServiceWatcher = new ServiceWatcher(context, action, this::onBind, @@ -100,16 +100,6 @@ public class ProxyLocationProvider extends AbstractLocationProvider { mRequest = ProviderRequest.EMPTY_REQUEST; } - private void updateLocationTagInfo(@NonNull BoundService boundService) { - if (boundService.metadata != null) { - final String tagsList = boundService.metadata.getString(KEY_LOCATION_TAGS); - if (tagsList != null) { - final String[] tags = tagsList.split(LOCATION_TAGS_SEPARATOR); - setLocationTags(new ArraySet<>(tags)); - } - } - } - private boolean checkServiceResolves() { return mServiceWatcher.checkServiceResolves(); } @@ -120,14 +110,22 @@ public class ProxyLocationProvider extends AbstractLocationProvider { synchronized (mLock) { mProxy = new Proxy(); mService = boundService.component; + + // update extra attribution tag info from manifest + if (boundService.metadata != null) { + String tagsList = boundService.metadata.getString(KEY_EXTRA_ATTRIBUTION_TAGS); + if (tagsList != null) { + setExtraAttributionTags( + new ArraySet<>(tagsList.split(EXTRA_ATTRIBUTION_TAGS_SEPARATOR))); + } + } + provider.setLocationProviderManager(mProxy); ProviderRequest request = mRequest; if (!request.equals(ProviderRequest.EMPTY_REQUEST)) { provider.setRequest(request); } - - updateLocationTagInfo(boundService); } } 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 c4c9ad088e45..1b58e924dd6a 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 @@ -353,7 +353,7 @@ public class LocationProviderManagerTest { @Test public void testGetLastLocation_ClearOnMockRemoval() { MockLocationProvider mockProvider = new MockLocationProvider(PROPERTIES, PROVIDER_IDENTITY, - null); + Collections.emptySet()); mockProvider.setAllowed(true); mManager.setMockProvider(mockProvider); @@ -1049,7 +1049,7 @@ public class LocationProviderManagerTest { private final ArrayList<Runnable> mFlushCallbacks = new ArrayList<>(); TestProvider(ProviderProperties properties, CallerIdentity identity) { - super(DIRECT_EXECUTOR, identity, properties, null); + super(DIRECT_EXECUTOR, identity, properties, Collections.emptySet()); } public void setProviderAllowed(boolean allowed) { diff --git a/services/tests/mockingservicestests/src/com/android/server/location/provider/MockableLocationProviderTest.java b/services/tests/mockingservicestests/src/com/android/server/location/provider/MockableLocationProviderTest.java index e8a0bb51e20f..cf5db2e0db98 100644 --- a/services/tests/mockingservicestests/src/com/android/server/location/provider/MockableLocationProviderTest.java +++ b/services/tests/mockingservicestests/src/com/android/server/location/provider/MockableLocationProviderTest.java @@ -43,6 +43,8 @@ import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; +import java.util.Collections; + @Presubmit @SmallTest @RunWith(AndroidJUnit4.class) @@ -72,7 +74,7 @@ public class MockableLocationProviderTest { .setAccuracy(ACCURACY_FINE) .build(), CallerIdentity.forTest(0, 1, "testpackage", "test"), - null); + Collections.emptySet()); mProvider = new MockableLocationProvider(lock); mProvider.getController().setListener(mListener); diff --git a/services/tests/mockingservicestests/src/com/android/server/location/test/FakeProvider.java b/services/tests/mockingservicestests/src/com/android/server/location/test/FakeProvider.java index a1eadbe4a64f..2bc1268f1b85 100644 --- a/services/tests/mockingservicestests/src/com/android/server/location/test/FakeProvider.java +++ b/services/tests/mockingservicestests/src/com/android/server/location/test/FakeProvider.java @@ -23,6 +23,7 @@ import com.android.server.location.provider.AbstractLocationProvider; import java.io.FileDescriptor; import java.io.PrintWriter; +import java.util.Collections; public class FakeProvider extends AbstractLocationProvider { @@ -40,7 +41,7 @@ public class FakeProvider extends AbstractLocationProvider { private final FakeProviderInterface mFakeInterface; public FakeProvider(FakeProviderInterface fakeInterface) { - super(Runnable::run, null, null, null); + super(Runnable::run, null, null, Collections.emptySet()); mFakeInterface = fakeInterface; } |