diff options
| -rw-r--r-- | api/test-current.txt | 1 | ||||
| -rw-r--r-- | location/java/android/location/ILocationManager.aidl | 1 | ||||
| -rw-r--r-- | location/java/android/location/LocationManager.java | 19 | ||||
| -rw-r--r-- | services/core/java/com/android/server/LocationManagerService.java | 11 |
4 files changed, 31 insertions, 1 deletions
diff --git a/api/test-current.txt b/api/test-current.txt index 0cf2f1bb33ae..f31eb28c2294 100644 --- a/api/test-current.txt +++ b/api/test-current.txt @@ -1092,6 +1092,7 @@ package android.location { public class LocationManager { method @NonNull public String[] getBackgroundThrottlingWhitelist(); method @NonNull public String[] getIgnoreSettingsWhitelist(); + method @Nullable @RequiresPermission("android.permission.READ_DEVICE_CONFIG") public java.util.List<java.lang.String> getProviderPackages(@NonNull String); method @NonNull public java.util.List<android.location.LocationRequest> getTestProviderCurrentRequests(String); method @RequiresPermission(anyOf={android.Manifest.permission.ACCESS_COARSE_LOCATION, android.Manifest.permission.ACCESS_FINE_LOCATION}) public void requestLocationUpdates(@Nullable android.location.LocationRequest, @NonNull android.location.LocationListener, @Nullable android.os.Looper); method @RequiresPermission(anyOf={android.Manifest.permission.ACCESS_COARSE_LOCATION, android.Manifest.permission.ACCESS_FINE_LOCATION}) public void requestLocationUpdates(@Nullable android.location.LocationRequest, @NonNull java.util.concurrent.Executor, @NonNull android.location.LocationListener); diff --git a/location/java/android/location/ILocationManager.aidl b/location/java/android/location/ILocationManager.aidl index d06ba12f5e2a..7f650e36dcd3 100644 --- a/location/java/android/location/ILocationManager.aidl +++ b/location/java/android/location/ILocationManager.aidl @@ -92,6 +92,7 @@ interface ILocationManager String getBestProvider(in Criteria criteria, boolean enabledOnly); ProviderProperties getProviderProperties(String provider); boolean isProviderPackage(String packageName); + List<String> getProviderPackages(String provider); void setExtraLocationControllerPackage(String packageName); String getExtraLocationControllerPackage(); diff --git a/location/java/android/location/LocationManager.java b/location/java/android/location/LocationManager.java index 68480ced0692..e7d7c7231015 100644 --- a/location/java/android/location/LocationManager.java +++ b/location/java/android/location/LocationManager.java @@ -51,6 +51,7 @@ import com.android.internal.annotations.GuardedBy; import com.android.internal.location.ProviderProperties; import com.android.internal.util.Preconditions; +import java.util.Collections; import java.util.List; import java.util.concurrent.Executor; import java.util.concurrent.RejectedExecutionException; @@ -1229,6 +1230,24 @@ public class LocationManager { } /** + * Returns a list of packages associated with the given provider, + * and an empty list if no package is associated with the provider. + * + * @hide + */ + @TestApi + @RequiresPermission(Manifest.permission.READ_DEVICE_CONFIG) + @Nullable + public List<String> getProviderPackages(@NonNull String provider) { + try { + return mService.getProviderPackages(provider); + } catch (RemoteException e) { + e.rethrowFromSystemServer(); + return Collections.emptyList(); + } + } + + /** * Sends additional commands to a location provider. Can be used to support provider specific * extensions to the Location Manager API. * diff --git a/services/core/java/com/android/server/LocationManagerService.java b/services/core/java/com/android/server/LocationManagerService.java index 35a06a977a58..f55427d5885e 100644 --- a/services/core/java/com/android/server/LocationManagerService.java +++ b/services/core/java/com/android/server/LocationManagerService.java @@ -2719,12 +2719,21 @@ public class LocationManagerService extends ILocationManager.Stub { return true; } } - return false; } } @Override + public List<String> getProviderPackages(String providerName) { + mContext.enforceCallingOrSelfPermission(Manifest.permission.READ_DEVICE_CONFIG, + Manifest.permission.READ_DEVICE_CONFIG + " permission required"); + synchronized (mLock) { + LocationProvider provider = getLocationProviderLocked(providerName); + return provider == null ? Collections.emptyList() : provider.getPackagesLocked(); + } + } + + @Override public void setExtraLocationControllerPackage(String packageName) { mContext.enforceCallingPermission(Manifest.permission.LOCATION_HARDWARE, Manifest.permission.LOCATION_HARDWARE + " permission required"); |