DO NOT MERGE Remove wifistatetracker lock access in BroadcastReceiver

The worksource reporting gets blocked by the
statetracker lock which can cause system restarts when
done from broadcastreceiver thread

Bug: 3153787
Change-Id: Ie70687e7453a1c3618bac1424562be44762b2c9d
diff --git a/services/java/com/android/server/WifiService.java b/services/java/com/android/server/WifiService.java
index c1e9965..5aa0111 100644
--- a/services/java/com/android/server/WifiService.java
+++ b/services/java/com/android/server/WifiService.java
@@ -174,6 +174,8 @@
     private static final int MESSAGE_SET_CHANNELS       = 8;
     private static final int MESSAGE_ENABLE_NETWORKS    = 9;
     private static final int MESSAGE_START_SCAN         = 10;
+    private static final int MESSAGE_REPORT_WORKSOURCE  = 11;
+    private static final int MESSAGE_ENABLE_RSSI_POLLING = 12;
 
 
     private final  WifiHandler mWifiHandler;
@@ -1664,8 +1666,8 @@
                 mScreenOff = false;
                 // Once the screen is on, we are not keeping WIFI running
                 // because of any locks so clear that tracking immediately.
-                reportStartWorkSource();
-                mWifiStateTracker.enableRssiPolling(true);
+                sendReportWorkSourceMessage();
+                sendEnableRssiPollingMessage(true);
                 /* DHCP or other temporary failures in the past can prevent
                  * a disabled network from being connected to, enable on screen on
                  */
@@ -1677,7 +1679,7 @@
                     Slog.d(TAG, "ACTION_SCREEN_OFF");
                 }
                 mScreenOff = true;
-                mWifiStateTracker.enableRssiPolling(false);
+                sendEnableRssiPollingMessage(false);
                 /*
                  * Set a timer to put Wi-Fi to sleep, but only if the screen is off
                  * AND the "stay on while plugged in" setting doesn't match the
@@ -1715,7 +1717,7 @@
                     Slog.d(TAG, "got ACTION_DEVICE_IDLE");
                 }
                 mDeviceIdle = true;
-                reportStartWorkSource();
+                sendReportWorkSourceMessage();
             } else if (action.equals(Intent.ACTION_BATTERY_CHANGED)) {
                 /*
                  * Set a timer to put Wi-Fi to sleep, but only if the screen is off
@@ -1821,6 +1823,15 @@
         Message.obtain(mWifiHandler, MESSAGE_ENABLE_NETWORKS).sendToTarget();
     }
 
+    private void sendReportWorkSourceMessage() {
+        Message.obtain(mWifiHandler, MESSAGE_REPORT_WORKSOURCE).sendToTarget();
+    }
+
+    private void sendEnableRssiPollingMessage(boolean enable) {
+        Message.obtain(mWifiHandler, MESSAGE_ENABLE_RSSI_POLLING, enable ? 1 : 0, 0).sendToTarget();
+    }
+
+
     private void reportStartWorkSource() {
         synchronized (mWifiStateTracker) {
             mTmpWorkSource.clear();
@@ -2021,6 +2032,12 @@
                     }
                     mWifiStateTracker.scan(forceActive);
                     break;
+                case MESSAGE_REPORT_WORKSOURCE:
+                    reportStartWorkSource();
+                    break;
+                case MESSAGE_ENABLE_RSSI_POLLING:
+                    mWifiStateTracker.enableRssiPolling(msg.arg1 == 1);
+                    break;
             }
         }
     }
@@ -2245,7 +2262,7 @@
 
             // Be aggressive about adding new locks into the accounted state...
             // we want to over-report rather than under-report.
-            reportStartWorkSource();
+            sendReportWorkSourceMessage();
 
             updateWifiState();
             return true;