Loading core/res/AndroidManifest.xml +1 −0 Original line number Diff line number Diff line Loading @@ -156,6 +156,7 @@ <protected-broadcast android:name="com.android.server.WifiManager.action.DELAYED_DRIVER_STOP" /> <protected-broadcast android:name="android.net.wifi.WIFI_STATE_CHANGED" /> <protected-broadcast android:name="android.net.wifi.WIFI_AP_STATE_CHANGED" /> <protected-broadcast android:name="android.net.wifi.WIFI_SCAN_AVAILABLE" /> <protected-broadcast android:name="android.net.wifi.SCAN_RESULTS" /> <protected-broadcast android:name="android.net.wifi.RSSI_CHANGED" /> <protected-broadcast android:name="android.net.wifi.STATE_CHANGE" /> Loading services/java/com/android/server/wifi/WifiService.java +1 −55 Original line number Diff line number Diff line Loading @@ -114,10 +114,6 @@ public final class WifiService extends IWifiManager.Stub { /* Tracks the persisted states for wi-fi & airplane mode */ final WifiSettingsStore mSettingsStore; /* The work source (UID) that triggered the current WIFI scan, synchronized * on this */ private WorkSource mScanWorkSource; /** * Asynchronous channel to WifiStateMachine */ Loading Loading @@ -255,17 +251,6 @@ public final class WifiService extends IWifiManager.Stub { }, new IntentFilter(Intent.ACTION_AIRPLANE_MODE_CHANGED)); mContext.registerReceiver( new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { if (intent.getAction().equals( WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)) { noteScanEnd(); } } }, new IntentFilter(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)); // Adding optimizations of only receiving broadcasts when wifi is enabled // can result in race conditions when apps toggle wifi in the background // without active user involvement. Always receive broadcasts. Loading @@ -274,44 +259,6 @@ public final class WifiService extends IWifiManager.Stub { private WifiController mWifiController; /** Tell battery stats about a new WIFI scan */ private void noteScanStart() { WorkSource scanWorkSource = null; synchronized (WifiService.this) { if (mScanWorkSource != null) { // Scan already in progress, don't add this one to battery stats return; } scanWorkSource = new WorkSource(Binder.getCallingUid()); mScanWorkSource = scanWorkSource; } long id = Binder.clearCallingIdentity(); try { mBatteryStats.noteWifiScanStartedFromSource(scanWorkSource); } catch (RemoteException e) { Log.w(TAG, e); } finally { Binder.restoreCallingIdentity(id); } } /** Tell battery stats that the current WIFI scan has completed */ private void noteScanEnd() { WorkSource scanWorkSource = null; synchronized (WifiService.this) { scanWorkSource = mScanWorkSource; mScanWorkSource = null; } if (scanWorkSource != null) { try { mBatteryStats.noteWifiScanStoppedFromSource(scanWorkSource); } catch (RemoteException e) { Log.w(TAG, e); } } } /** * Check if Wi-Fi needs to be enabled and start * if needed Loading Loading @@ -352,8 +299,7 @@ public final class WifiService extends IWifiManager.Stub { */ public void startScan() { enforceChangePermission(); mWifiStateMachine.startScan(); noteScanStart(); mWifiStateMachine.startScan(Binder.getCallingUid()); } private void enforceAccessPermission() { Loading wifi/java/android/net/wifi/WifiManager.java +12 −0 Original line number Diff line number Diff line Loading @@ -69,6 +69,18 @@ public class WifiManager { */ public static final int ERROR_AUTHENTICATING = 1; /** * Broadcast intent action indicating whether Wi-Fi scanning is allowed currently * @hide */ public static final String WIFI_SCAN_AVAILABLE = "wifi_scan_available"; /** * Extra int indicating scan availability, WIFI_STATE_ENABLED and WIFI_STATE_DISABLED * @hide */ public static final String EXTRA_SCAN_AVAILABLE = "scan_enabled"; /** * Broadcast intent action indicating that Wi-Fi has been enabled, disabled, * enabling, disabling, or unknown. One extra provides this state as an int. Loading wifi/java/android/net/wifi/WifiStateMachine.java +51 −5 Original line number Diff line number Diff line Loading @@ -141,6 +141,8 @@ public class WifiStateMachine extends StateMachine { */ private int mOperationalMode = CONNECT_MODE; private boolean mScanResultIsPending = false; private WorkSource mScanWorkSource = null; private static final int UNKNOWN_SCAN_SOURCE = -1; /* Tracks if state machine has received any screen state change broadcast yet. * We can miss one of these at boot. */ Loading Loading @@ -601,7 +603,7 @@ public class WifiStateMachine extends StateMachine { new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { startScan(); startScan(UNKNOWN_SCAN_SOURCE); } }, new IntentFilter(ACTION_START_SCAN)); Loading Loading @@ -694,6 +696,11 @@ public class WifiStateMachine extends StateMachine { //start the state machine start(); final Intent intent = new Intent(WifiManager.WIFI_SCAN_AVAILABLE); intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT); intent.putExtra(WifiManager.EXTRA_SCAN_AVAILABLE, WIFI_STATE_DISABLED); mContext.sendStickyBroadcastAsUser(intent, UserHandle.ALL); } /********************************************************* Loading @@ -716,8 +723,31 @@ public class WifiStateMachine extends StateMachine { /** * TODO: doc */ public void startScan() { sendMessage(CMD_START_SCAN); public void startScan(int callingUid) { sendMessage(CMD_START_SCAN, callingUid); } private void noteScanStart(int callingUid) { if (mScanWorkSource == null && callingUid != UNKNOWN_SCAN_SOURCE) { mScanWorkSource = new WorkSource(callingUid); try { mBatteryStats.noteWifiScanStartedFromSource(mScanWorkSource); } catch (RemoteException e) { log(e.toString()); } } } private void noteScanEnd() { if (mScanWorkSource != null) { try { mBatteryStats.noteWifiScanStoppedFromSource(mScanWorkSource); } catch (RemoteException e) { log(e.toString()); } finally { mScanWorkSource = null; } } } private void startScanNative(int type) { Loading Loading @@ -1575,6 +1605,7 @@ public class WifiStateMachine extends StateMachine { } private void sendScanResultsAvailableBroadcast() { noteScanEnd(); Intent intent = new Intent(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION); intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT); mContext.sendBroadcastAsUser(intent, UserHandle.ALL); Loading Loading @@ -1919,6 +1950,7 @@ public class WifiStateMachine extends StateMachine { } break; /* Discard */ case CMD_START_SCAN: case CMD_START_SUPPLICANT: case CMD_STOP_SUPPLICANT: case CMD_STOP_SUPPLICANT_FAILED: Loading @@ -1933,7 +1965,6 @@ public class WifiStateMachine extends StateMachine { case CMD_STOP_AP: case CMD_TETHER_STATE_CHANGE: case CMD_TETHER_NOTIFICATION_TIMED_OUT: case CMD_START_SCAN: case CMD_DISCONNECT: case CMD_RECONNECT: case CMD_REASSOCIATE: Loading Loading @@ -2436,11 +2467,18 @@ public class WifiStateMachine extends StateMachine { mWifiNative.setPowerSave(true); if (mP2pSupported) mWifiP2pChannel.sendMessage(WifiStateMachine.CMD_ENABLE_P2P); final Intent intent = new Intent(WifiManager.WIFI_SCAN_AVAILABLE); intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT); intent.putExtra(WifiManager.EXTRA_SCAN_AVAILABLE, WIFI_STATE_ENABLED); mContext.sendStickyBroadcastAsUser(intent, UserHandle.ALL); } @Override public boolean processMessage(Message message) { switch(message.what) { case CMD_START_SCAN: noteScanStart(message.arg1); startScanNative(WifiNative.SCAN_WITH_CONNECTION_SETUP); break; case CMD_SET_COUNTRY_CODE: Loading Loading @@ -2561,6 +2599,12 @@ public class WifiStateMachine extends StateMachine { mIsRunning = false; updateBatteryWorkSource(null); mScanResults = new ArrayList<ScanResult>(); final Intent intent = new Intent(WifiManager.WIFI_SCAN_AVAILABLE); intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT); intent.putExtra(WifiManager.EXTRA_SCAN_AVAILABLE, WIFI_STATE_DISABLED); mContext.sendStickyBroadcastAsUser(intent, UserHandle.ALL); noteScanEnd(); // wrap up any pending request. } } Loading Loading @@ -2711,6 +2755,7 @@ public class WifiStateMachine extends StateMachine { // Handle scan. All the connection related commands are // handled only in ConnectModeState case CMD_START_SCAN: noteScanStart(message.arg1); startScanNative(WifiNative.SCAN_WITHOUT_CONNECTION_SETUP); break; default: Loading Loading @@ -2974,6 +3019,7 @@ public class WifiStateMachine extends StateMachine { break; case CMD_START_SCAN: /* Do not attempt to connect when we are already connected */ noteScanStart(message.arg1); startScanNative(WifiNative.SCAN_WITHOUT_CONNECTION_SETUP); break; /* Ignore connection to same network */ Loading Loading @@ -3291,7 +3337,7 @@ public class WifiStateMachine extends StateMachine { if (mP2pConnected.get()) break; if (message.arg1 == mPeriodicScanToken && mWifiConfigStore.getConfiguredNetworks().size() == 0) { sendMessage(CMD_START_SCAN); sendMessage(CMD_START_SCAN, UNKNOWN_SCAN_SOURCE); sendMessageDelayed(obtainMessage(CMD_NO_NETWORKS_PERIODIC_SCAN, ++mPeriodicScanToken, 0), mSupplicantScanIntervalMs); } Loading Loading
core/res/AndroidManifest.xml +1 −0 Original line number Diff line number Diff line Loading @@ -156,6 +156,7 @@ <protected-broadcast android:name="com.android.server.WifiManager.action.DELAYED_DRIVER_STOP" /> <protected-broadcast android:name="android.net.wifi.WIFI_STATE_CHANGED" /> <protected-broadcast android:name="android.net.wifi.WIFI_AP_STATE_CHANGED" /> <protected-broadcast android:name="android.net.wifi.WIFI_SCAN_AVAILABLE" /> <protected-broadcast android:name="android.net.wifi.SCAN_RESULTS" /> <protected-broadcast android:name="android.net.wifi.RSSI_CHANGED" /> <protected-broadcast android:name="android.net.wifi.STATE_CHANGE" /> Loading
services/java/com/android/server/wifi/WifiService.java +1 −55 Original line number Diff line number Diff line Loading @@ -114,10 +114,6 @@ public final class WifiService extends IWifiManager.Stub { /* Tracks the persisted states for wi-fi & airplane mode */ final WifiSettingsStore mSettingsStore; /* The work source (UID) that triggered the current WIFI scan, synchronized * on this */ private WorkSource mScanWorkSource; /** * Asynchronous channel to WifiStateMachine */ Loading Loading @@ -255,17 +251,6 @@ public final class WifiService extends IWifiManager.Stub { }, new IntentFilter(Intent.ACTION_AIRPLANE_MODE_CHANGED)); mContext.registerReceiver( new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { if (intent.getAction().equals( WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)) { noteScanEnd(); } } }, new IntentFilter(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)); // Adding optimizations of only receiving broadcasts when wifi is enabled // can result in race conditions when apps toggle wifi in the background // without active user involvement. Always receive broadcasts. Loading @@ -274,44 +259,6 @@ public final class WifiService extends IWifiManager.Stub { private WifiController mWifiController; /** Tell battery stats about a new WIFI scan */ private void noteScanStart() { WorkSource scanWorkSource = null; synchronized (WifiService.this) { if (mScanWorkSource != null) { // Scan already in progress, don't add this one to battery stats return; } scanWorkSource = new WorkSource(Binder.getCallingUid()); mScanWorkSource = scanWorkSource; } long id = Binder.clearCallingIdentity(); try { mBatteryStats.noteWifiScanStartedFromSource(scanWorkSource); } catch (RemoteException e) { Log.w(TAG, e); } finally { Binder.restoreCallingIdentity(id); } } /** Tell battery stats that the current WIFI scan has completed */ private void noteScanEnd() { WorkSource scanWorkSource = null; synchronized (WifiService.this) { scanWorkSource = mScanWorkSource; mScanWorkSource = null; } if (scanWorkSource != null) { try { mBatteryStats.noteWifiScanStoppedFromSource(scanWorkSource); } catch (RemoteException e) { Log.w(TAG, e); } } } /** * Check if Wi-Fi needs to be enabled and start * if needed Loading Loading @@ -352,8 +299,7 @@ public final class WifiService extends IWifiManager.Stub { */ public void startScan() { enforceChangePermission(); mWifiStateMachine.startScan(); noteScanStart(); mWifiStateMachine.startScan(Binder.getCallingUid()); } private void enforceAccessPermission() { Loading
wifi/java/android/net/wifi/WifiManager.java +12 −0 Original line number Diff line number Diff line Loading @@ -69,6 +69,18 @@ public class WifiManager { */ public static final int ERROR_AUTHENTICATING = 1; /** * Broadcast intent action indicating whether Wi-Fi scanning is allowed currently * @hide */ public static final String WIFI_SCAN_AVAILABLE = "wifi_scan_available"; /** * Extra int indicating scan availability, WIFI_STATE_ENABLED and WIFI_STATE_DISABLED * @hide */ public static final String EXTRA_SCAN_AVAILABLE = "scan_enabled"; /** * Broadcast intent action indicating that Wi-Fi has been enabled, disabled, * enabling, disabling, or unknown. One extra provides this state as an int. Loading
wifi/java/android/net/wifi/WifiStateMachine.java +51 −5 Original line number Diff line number Diff line Loading @@ -141,6 +141,8 @@ public class WifiStateMachine extends StateMachine { */ private int mOperationalMode = CONNECT_MODE; private boolean mScanResultIsPending = false; private WorkSource mScanWorkSource = null; private static final int UNKNOWN_SCAN_SOURCE = -1; /* Tracks if state machine has received any screen state change broadcast yet. * We can miss one of these at boot. */ Loading Loading @@ -601,7 +603,7 @@ public class WifiStateMachine extends StateMachine { new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { startScan(); startScan(UNKNOWN_SCAN_SOURCE); } }, new IntentFilter(ACTION_START_SCAN)); Loading Loading @@ -694,6 +696,11 @@ public class WifiStateMachine extends StateMachine { //start the state machine start(); final Intent intent = new Intent(WifiManager.WIFI_SCAN_AVAILABLE); intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT); intent.putExtra(WifiManager.EXTRA_SCAN_AVAILABLE, WIFI_STATE_DISABLED); mContext.sendStickyBroadcastAsUser(intent, UserHandle.ALL); } /********************************************************* Loading @@ -716,8 +723,31 @@ public class WifiStateMachine extends StateMachine { /** * TODO: doc */ public void startScan() { sendMessage(CMD_START_SCAN); public void startScan(int callingUid) { sendMessage(CMD_START_SCAN, callingUid); } private void noteScanStart(int callingUid) { if (mScanWorkSource == null && callingUid != UNKNOWN_SCAN_SOURCE) { mScanWorkSource = new WorkSource(callingUid); try { mBatteryStats.noteWifiScanStartedFromSource(mScanWorkSource); } catch (RemoteException e) { log(e.toString()); } } } private void noteScanEnd() { if (mScanWorkSource != null) { try { mBatteryStats.noteWifiScanStoppedFromSource(mScanWorkSource); } catch (RemoteException e) { log(e.toString()); } finally { mScanWorkSource = null; } } } private void startScanNative(int type) { Loading Loading @@ -1575,6 +1605,7 @@ public class WifiStateMachine extends StateMachine { } private void sendScanResultsAvailableBroadcast() { noteScanEnd(); Intent intent = new Intent(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION); intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT); mContext.sendBroadcastAsUser(intent, UserHandle.ALL); Loading Loading @@ -1919,6 +1950,7 @@ public class WifiStateMachine extends StateMachine { } break; /* Discard */ case CMD_START_SCAN: case CMD_START_SUPPLICANT: case CMD_STOP_SUPPLICANT: case CMD_STOP_SUPPLICANT_FAILED: Loading @@ -1933,7 +1965,6 @@ public class WifiStateMachine extends StateMachine { case CMD_STOP_AP: case CMD_TETHER_STATE_CHANGE: case CMD_TETHER_NOTIFICATION_TIMED_OUT: case CMD_START_SCAN: case CMD_DISCONNECT: case CMD_RECONNECT: case CMD_REASSOCIATE: Loading Loading @@ -2436,11 +2467,18 @@ public class WifiStateMachine extends StateMachine { mWifiNative.setPowerSave(true); if (mP2pSupported) mWifiP2pChannel.sendMessage(WifiStateMachine.CMD_ENABLE_P2P); final Intent intent = new Intent(WifiManager.WIFI_SCAN_AVAILABLE); intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT); intent.putExtra(WifiManager.EXTRA_SCAN_AVAILABLE, WIFI_STATE_ENABLED); mContext.sendStickyBroadcastAsUser(intent, UserHandle.ALL); } @Override public boolean processMessage(Message message) { switch(message.what) { case CMD_START_SCAN: noteScanStart(message.arg1); startScanNative(WifiNative.SCAN_WITH_CONNECTION_SETUP); break; case CMD_SET_COUNTRY_CODE: Loading Loading @@ -2561,6 +2599,12 @@ public class WifiStateMachine extends StateMachine { mIsRunning = false; updateBatteryWorkSource(null); mScanResults = new ArrayList<ScanResult>(); final Intent intent = new Intent(WifiManager.WIFI_SCAN_AVAILABLE); intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT); intent.putExtra(WifiManager.EXTRA_SCAN_AVAILABLE, WIFI_STATE_DISABLED); mContext.sendStickyBroadcastAsUser(intent, UserHandle.ALL); noteScanEnd(); // wrap up any pending request. } } Loading Loading @@ -2711,6 +2755,7 @@ public class WifiStateMachine extends StateMachine { // Handle scan. All the connection related commands are // handled only in ConnectModeState case CMD_START_SCAN: noteScanStart(message.arg1); startScanNative(WifiNative.SCAN_WITHOUT_CONNECTION_SETUP); break; default: Loading Loading @@ -2974,6 +3019,7 @@ public class WifiStateMachine extends StateMachine { break; case CMD_START_SCAN: /* Do not attempt to connect when we are already connected */ noteScanStart(message.arg1); startScanNative(WifiNative.SCAN_WITHOUT_CONNECTION_SETUP); break; /* Ignore connection to same network */ Loading Loading @@ -3291,7 +3337,7 @@ public class WifiStateMachine extends StateMachine { if (mP2pConnected.get()) break; if (message.arg1 == mPeriodicScanToken && mWifiConfigStore.getConfiguredNetworks().size() == 0) { sendMessage(CMD_START_SCAN); sendMessage(CMD_START_SCAN, UNKNOWN_SCAN_SOURCE); sendMessageDelayed(obtainMessage(CMD_NO_NETWORKS_PERIODIC_SCAN, ++mPeriodicScanToken, 0), mSupplicantScanIntervalMs); } Loading