From 65ada07fcc88600d1a8c77269f62590f630f7aab Mon Sep 17 00:00:00 2001 From: Fyodor Kupolov Date: Wed, 14 Oct 2015 10:19:23 -0700 Subject: 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 --- .../com/android/server/wifi/WifiServiceImpl.java | 29 ++++++++++++++-------- 1 file changed, 18 insertions(+), 11 deletions(-) (limited to 'service') 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 @@ public final class WifiServiceImpl extends IWifiManager.Stub { long ident = Binder.clearCallingIdentity(); try { if (!canReadPeerMacAddresses && !isActiveNetworkScorer - && !isLocationEnabled()) { + && !isLocationEnabled(callingPackage)) { return new ArrayList(); } if (!canReadPeerMacAddresses && !isActiveNetworkScorer @@ -1008,9 +1008,12 @@ public final class WifiServiceImpl extends IWifiManager.Stub { } } - 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 @@ public final class WifiServiceImpl extends IWifiManager.Stub { && 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 @@ public final class WifiServiceImpl extends IWifiManager.Stub { 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. * -- cgit v1.2.3