Fix foreground scans for pre-M apps when location is disabled
Wi-Fi scans should be enabled for legacy foreground apps when location is
disabled.
Bug: 23081999
Change-Id: I09ff32ab9845e989ed292824b7aee84d10d260cf
diff --git a/service/java/com/android/server/wifi/WifiServiceImpl.java b/service/java/com/android/server/wifi/WifiServiceImpl.java
index b025566..b675cd6 100644
--- a/service/java/com/android/server/wifi/WifiServiceImpl.java
+++ b/service/java/com/android/server/wifi/WifiServiceImpl.java
@@ -988,7 +988,7 @@
long ident = Binder.clearCallingIdentity();
try {
if (!canReadPeerMacAddresses && !isActiveNetworkScorer
- && !isLocationEnabled()) {
+ && !isLocationEnabled(callingPackage)) {
return new ArrayList<ScanResult>();
}
if (!canReadPeerMacAddresses && !isActiveNetworkScorer
@@ -1008,9 +1008,12 @@
}
}
- private boolean isLocationEnabled() {
- return Settings.Secure.getInt(mContext.getContentResolver(), Settings.Secure.LOCATION_MODE,
- Settings.Secure.LOCATION_MODE_OFF) != Settings.Secure.LOCATION_MODE_OFF;
+ private boolean isLocationEnabled(String callingPackage) {
+ boolean legacyForegroundApp = !isMApp(mContext, callingPackage)
+ && isForegroundApp(callingPackage);
+ return legacyForegroundApp || Settings.Secure.getInt(mContext.getContentResolver(),
+ Settings.Secure.LOCATION_MODE, Settings.Secure.LOCATION_MODE_OFF)
+ != Settings.Secure.LOCATION_MODE_OFF;
}
/**
@@ -2073,13 +2076,7 @@
&& checkAppOppAllowed(AppOpsManager.OP_COARSE_LOCATION, callingPackage, uid)) {
return true;
}
- boolean apiLevel23App = true;
- try {
- apiLevel23App = mContext.getPackageManager().getApplicationInfo(
- callingPackage, 0).targetSdkVersion >= Build.VERSION_CODES.M;
- } catch (PackageManager.NameNotFoundException e) {
- // In case of exception, assume app's API level is 23+
- }
+ boolean apiLevel23App = isMApp(mContext, callingPackage);
// Pre-M apps running in the foreground should continue getting scan results
if (!apiLevel23App && isForegroundApp(callingPackage)) {
return true;
@@ -2093,6 +2090,16 @@
return mAppOps.noteOp(op, uid, callingPackage) == AppOpsManager.MODE_ALLOWED;
}
+ private static boolean isMApp(Context context, String pkgName) {
+ try {
+ return context.getPackageManager().getApplicationInfo(pkgName, 0)
+ .targetSdkVersion >= Build.VERSION_CODES.M;
+ } catch (PackageManager.NameNotFoundException e) {
+ // In case of exception, assume M app (more strict checking)
+ }
+ return true;
+ }
+
/**
* Return true if the specified package name is a foreground app.
*