Don't allow scans while device is idle.

Change-Id: If682daba7948c64872fc07e539e957cbf9f3d31f
diff --git a/service/java/com/android/server/wifi/WifiServiceImpl.java b/service/java/com/android/server/wifi/WifiServiceImpl.java
index 98aa85a..aa5f99c 100644
--- a/service/java/com/android/server/wifi/WifiServiceImpl.java
+++ b/service/java/com/android/server/wifi/WifiServiceImpl.java
@@ -44,6 +44,7 @@
 import android.os.IBinder;
 import android.os.Message;
 import android.os.Messenger;
+import android.os.PowerManager;
 import android.os.RemoteException;
 import android.os.SystemClock;
 import android.os.SystemProperties;
@@ -116,6 +117,7 @@
     private int mMulticastDisabled;
 
     private final IBatteryStats mBatteryStats;
+    private final PowerManager mPowerManager;
     private final AppOpsManager mAppOps;
 
     private String mInterfaceName;
@@ -303,6 +305,7 @@
         mWifiStateMachine = new WifiStateMachine(mContext, mInterfaceName, mTrafficPoller);
         mWifiStateMachine.enableRssiPolling(true);
         mBatteryStats = BatteryStatsService.getService();
+        mPowerManager = context.getSystemService(PowerManager.class);
         mAppOps = (AppOpsManager)context.getSystemService(Context.APP_OPS_SERVICE);
 
         mNotificationController = new WifiNotificationController(mContext, mWifiStateMachine);
@@ -348,6 +351,7 @@
         // without active user involvement. Always receive broadcasts.
         registerForBroadcasts();
         registerForPackageOrUserRemoval();
+        mInIdleMode = mPowerManager.isDeviceIdleMode();
 
         mWifiController.start();
 
@@ -391,6 +395,12 @@
     public void startLocationRestrictedScan(WorkSource workSource) {
         enforceChangePermission();
         enforceLocationHardwarePermission();
+        synchronized (mBatchedScanners) {
+            if (mInIdleMode) {
+                mScanPending = true;
+                return;
+            }
+        }
         List<WifiChannel> channels = getChannelList();
         if (channels == null) {
             Slog.e(TAG, "startLocationRestrictedScan cant get channels");
@@ -419,6 +429,12 @@
      */
     public void startScan(ScanSettings settings, WorkSource workSource) {
         enforceChangePermission();
+        synchronized (mBatchedScanners) {
+            if (mInIdleMode) {
+                mScanPending = true;
+                return;
+            }
+        }
         if (settings != null) {
             settings = new ScanSettings(settings);
             if (!settings.isValid()) {
@@ -462,6 +478,8 @@
     }
 
     private final List<BatchedScanRequest> mBatchedScanners = new ArrayList<BatchedScanRequest>();
+    boolean mInIdleMode;
+    boolean mScanPending;
 
     public boolean isBatchedScanSupported() {
         return mBatchedScanSupported;
@@ -552,7 +570,7 @@
         int responsibleUid = 0;
         double responsibleCsph = 0; // Channel Scans Per Hour
 
-        if (mBatchedScanners.size() == 0) {
+        if (mBatchedScanners.size() == 0 || mInIdleMode) {
             mWifiStateMachine.setBatchedScanSettings(null, 0, 0, null);
             return;
         }
@@ -624,6 +642,27 @@
                 responsibleWorkSource);
     }
 
+    void handleIdleModeChanged() {
+        boolean doScan = false;
+        synchronized (mBatchedScanners) {
+            boolean idle = mPowerManager.isDeviceIdleMode();
+            if (mInIdleMode != idle) {
+                mInIdleMode = idle;
+                if (!idle) {
+                    if (mScanPending) {
+                        mScanPending = false;
+                        doScan = true;
+                    }
+                }
+                resolveBatchedScannersLocked();
+            }
+        }
+        if (doScan) {
+            // Someone requested a scan while we were idle; do a full scan now.
+            startScan(null, null);
+        }
+    }
+
     private void enforceAccessPermission() {
         mContext.enforceCallingOrSelfPermission(android.Manifest.permission.ACCESS_WIFI_STATE,
                 "WifiService");
@@ -1398,6 +1437,8 @@
             } else if (action.equals(TelephonyIntents.ACTION_EMERGENCY_CALLBACK_MODE_CHANGED)) {
                 boolean emergencyMode = intent.getBooleanExtra("phoneinECMState", false);
                 mWifiController.sendMessage(CMD_EMERGENCY_MODE_CHANGED, emergencyMode ? 1 : 0, 0);
+            } else if (action.equals(PowerManager.ACTION_DEVICE_IDLE_MODE_CHANGED)) {
+                handleIdleModeChanged();
             }
         }
     };
@@ -1428,6 +1469,7 @@
         intentFilter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION);
         intentFilter.addAction(BluetoothAdapter.ACTION_CONNECTION_STATE_CHANGED);
         intentFilter.addAction(TelephonyIntents.ACTION_EMERGENCY_CALLBACK_MODE_CHANGED);
+        intentFilter.addAction(PowerManager.ACTION_DEVICE_IDLE_MODE_CHANGED);
         mContext.registerReceiver(mReceiver, intentFilter);
     }
 
@@ -1477,6 +1519,8 @@
                                        Settings.Global.STAY_ON_WHILE_PLUGGED_IN, 0));
         pw.println("mMulticastEnabled " + mMulticastEnabled);
         pw.println("mMulticastDisabled " + mMulticastDisabled);
+        pw.println("mInIdleMode " + mInIdleMode);
+        pw.println("mScanPending " + mScanPending);
         mWifiController.dump(fd, pw, args);
         mSettingsStore.dump(fd, pw, args);
         mNotificationController.dump(fd, pw, args);