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.
      *