Skip to content

Commit 8dbb634

Browse files
author
Victoria Lease
committed
Allow apps to getProviders() without location permissions.
This restores MR0's behavior in this regard - apps calling LocationManager.getProviders() or LocationManager.getBestProvider() will no longer receive a SecurityException if they do not have any location permissions. Instead, as was the behavior in MR0, they only receive providers that their permissions grant them access to, including an empty list if they have no permission whatsoever. Bug: 7207864 Change-Id: I027df425e258d436c4821c34a25bc46a2a292824
1 parent 537d47f commit 8dbb634

File tree

1 file changed

+29
-13
lines changed

1 file changed

+29
-13
lines changed

services/java/com/android/server/LocationManagerService.java

Lines changed: 29 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -601,6 +601,23 @@ private void checkGeofencePermission() {
601601
}
602602
}
603603

604+
private boolean isAllowedProviderSafe(String provider) {
605+
if (LocationManager.GPS_PROVIDER.equals(provider) ||
606+
LocationManager.PASSIVE_PROVIDER.equals(provider)) {
607+
// gps and passive providers require FINE permission
608+
return mContext.checkCallingOrSelfPermission(ACCESS_FINE_LOCATION)
609+
== PackageManager.PERMISSION_GRANTED;
610+
} else if (LocationManager.NETWORK_PROVIDER.equals(provider) ||
611+
LocationManager.FUSED_PROVIDER.equals(provider)) {
612+
// network and fused providers are ok with COARSE or FINE
613+
return (mContext.checkCallingOrSelfPermission(ACCESS_FINE_LOCATION)
614+
== PackageManager.PERMISSION_GRANTED) ||
615+
(mContext.checkCallingOrSelfPermission(ACCESS_COARSE_LOCATION)
616+
== PackageManager.PERMISSION_GRANTED);
617+
}
618+
return false;
619+
}
620+
604621
/**
605622
* Returns all providers by name, including passive, but excluding
606623
* fused.
@@ -632,8 +649,6 @@ public List<String> getAllProviders() {
632649
*/
633650
@Override
634651
public List<String> getProviders(Criteria criteria, boolean enabledOnly) {
635-
checkPermission();
636-
637652
ArrayList<String> out;
638653
synchronized (mLock) {
639654
out = new ArrayList<String>(mProviders.size());
@@ -642,14 +657,16 @@ public List<String> getProviders(Criteria criteria, boolean enabledOnly) {
642657
if (LocationManager.FUSED_PROVIDER.equals(name)) {
643658
continue;
644659
}
645-
if (enabledOnly && !isAllowedBySettingsLocked(name)) {
646-
continue;
647-
}
648-
if (criteria != null && !LocationProvider.propertiesMeetCriteria(
649-
name, provider.getProperties(), criteria)) {
650-
continue;
660+
if (isAllowedProviderSafe(name)) {
661+
if (enabledOnly && !isAllowedBySettingsLocked(name)) {
662+
continue;
663+
}
664+
if (criteria != null && !LocationProvider.propertiesMeetCriteria(
665+
name, provider.getProperties(), criteria)) {
666+
continue;
667+
}
668+
out.add(name);
651669
}
652-
out.add(name);
653670
}
654671
}
655672

@@ -660,23 +677,22 @@ public List<String> getProviders(Criteria criteria, boolean enabledOnly) {
660677
/**
661678
* Return the name of the best provider given a Criteria object.
662679
* This method has been deprecated from the public API,
663-
* and the whole LoactionProvider (including #meetsCriteria)
680+
* and the whole LocationProvider (including #meetsCriteria)
664681
* has been deprecated as well. So this method now uses
665682
* some simplified logic.
666683
*/
667684
@Override
668685
public String getBestProvider(Criteria criteria, boolean enabledOnly) {
669686
String result = null;
670-
checkPermission();
671687

672688
List<String> providers = getProviders(criteria, enabledOnly);
673-
if (providers.size() < 1) {
689+
if (!providers.isEmpty()) {
674690
result = pickBest(providers);
675691
if (D) Log.d(TAG, "getBestProvider(" + criteria + ", " + enabledOnly + ")=" + result);
676692
return result;
677693
}
678694
providers = getProviders(null, enabledOnly);
679-
if (providers.size() >= 1) {
695+
if (!providers.isEmpty()) {
680696
result = pickBest(providers);
681697
if (D) Log.d(TAG, "getBestProvider(" + criteria + ", " + enabledOnly + ")=" + result);
682698
return result;

0 commit comments

Comments
 (0)