Skip to content

Commit 8658e1a

Browse files
Victoria LeaseAndroid (Google) Code Review
authored andcommitted
Merge "Allow apps to getProviders() without location permissions." into jb-mr1-dev
2 parents 18fd992 + 8dbb634 commit 8658e1a

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)