From 3126c90786bfa60d9fd74f231312b9230456f811 Mon Sep 17 00:00:00 2001 From: Soonil Nagarkar Date: Mon, 4 Mar 2019 18:29:49 -0800 Subject: [PATCH] Add PROVIDERS_CHANGED_ACTION extra for provider Give clients a way to know which providers have changed state, useful since LOCATION_PROVIDERS_ALLOWED will be removed in the future. Bug: 127372321 Test: manual Change-Id: I16c0acbaad97930bea23084b50193582cc918fa2 --- api/current.txt | 1 + location/java/android/location/LocationManager.java | 12 +++++++++++- .../com/android/server/LocationManagerService.java | 13 +++++++++---- 3 files changed, 21 insertions(+), 5 deletions(-) diff --git a/api/current.txt b/api/current.txt index d1b77f2c10960..d6a8b78dfbe04 100644 --- a/api/current.txt +++ b/api/current.txt @@ -22966,6 +22966,7 @@ package android.location { method public void unregisterGnssMeasurementsCallback(@NonNull android.location.GnssMeasurementsEvent.Callback); method public void unregisterGnssNavigationMessageCallback(@NonNull android.location.GnssNavigationMessage.Callback); method public void unregisterGnssStatusCallback(@NonNull android.location.GnssStatus.Callback); + field public static final String EXTRA_PROVIDER_NAME = "android.location.extra.PROVIDER_NAME"; field public static final String GPS_PROVIDER = "gps"; field public static final String KEY_LOCATION_CHANGED = "location"; field public static final String KEY_PROVIDER_ENABLED = "providerEnabled"; diff --git a/location/java/android/location/LocationManager.java b/location/java/android/location/LocationManager.java index dd179f3e9bab9..050b2ec26c8d8 100644 --- a/location/java/android/location/LocationManager.java +++ b/location/java/android/location/LocationManager.java @@ -167,10 +167,20 @@ public class LocationManager { /** * Broadcast intent action when the set of enabled location providers changes. To check the - * status of a provider, use {@link #isProviderEnabled(String)}. + * status of a provider, use {@link #isProviderEnabled(String)}. Depending on API level, may + * include a string intent extra, {@link #EXTRA_PROVIDER_NAME}, with the name of the provider + * whose state has changed. See {@link #EXTRA_PROVIDER_NAME} for the supported API level. + * + * @see #EXTRA_PROVIDER_NAME */ public static final String PROVIDERS_CHANGED_ACTION = "android.location.PROVIDERS_CHANGED"; + /** + * Intent extra included with {@link #PROVIDERS_CHANGED_ACTION} broadcasts, containing the name + * of the location provider that has changed, to be used with location provider APIs. + */ + public static final String EXTRA_PROVIDER_NAME = "android.location.extra.PROVIDER_NAME"; + /** * Broadcast intent action when the device location mode changes. To check the location mode, * use {@link #isLocationEnabled()}. diff --git a/services/core/java/com/android/server/LocationManagerService.java b/services/core/java/com/android/server/LocationManagerService.java index c2a06117cf149..7fab2b96ddbe1 100644 --- a/services/core/java/com/android/server/LocationManagerService.java +++ b/services/core/java/com/android/server/LocationManagerService.java @@ -501,6 +501,8 @@ public class LocationManagerService extends ILocationManager.Stub { } if (broadcast) { + // needs to be sent to everyone because we don't know which user may have changed + // LOCATION_MODE state. mContext.sendBroadcastAsUser( new Intent(LocationManager.MODE_CHANGED_ACTION), UserHandle.ALL); @@ -1212,6 +1214,13 @@ public class LocationManagerService extends ILocationManager.Stub { "-" + mName, mCurrentUserId); } + + // needs to be sent to all users because whether or not a provider is enabled for + // a given user is complicated... we broadcast to everyone and let them figure it + // out via isProviderEnabled() + Intent intent = new Intent(LocationManager.PROVIDERS_CHANGED_ACTION); + intent.putExtra(LocationManager.EXTRA_PROVIDER_NAME, mName); + mContext.sendBroadcastAsUser(intent, UserHandle.ALL); } if (useable == mUseable) { @@ -1232,10 +1241,6 @@ public class LocationManagerService extends ILocationManager.Stub { } updateProviderUseableLocked(this); - - mContext.sendBroadcastAsUser( - new Intent(LocationManager.PROVIDERS_CHANGED_ACTION), - UserHandle.ALL); } @GuardedBy("mLock")