summaryrefslogtreecommitdiffstats
path: root/wifi/java/android/net
diff options
context:
space:
mode:
authorRobert Greenwalt <rgreenwalt@google.com>2013-06-25 11:41:53 -0700
committerRobert Greenwalt <rgreenwalt@google.com>2013-06-26 10:00:16 -0700
commit89710842585404ea33f941afeb2c321e706005e9 (patch)
tree57ea04ccced78eafbef023fc8ae556904393808a /wifi/java/android/net
parentf285a709157b16ed970573988dec603dde89cb11 (diff)
downloadframeworks_base-89710842585404ea33f941afeb2c321e706005e9.zip
frameworks_base-89710842585404ea33f941afeb2c321e706005e9.tar.gz
frameworks_base-89710842585404ea33f941afeb2c321e706005e9.tar.bz2
Fix power issues around wifi scans.
- Sending a broadcast indicating when scan requests could be serviced so that apps don't request scans we won't do anything with. - Fix our batt stats accounting so we only count it if we send the request to the driver. bug: 8868201 bug: 9496690 Change-Id: I64a4f1c294c848ac64c50d8854ed4a6a1a47f603
Diffstat (limited to 'wifi/java/android/net')
-rw-r--r--wifi/java/android/net/wifi/WifiManager.java12
-rw-r--r--wifi/java/android/net/wifi/WifiStateMachine.java56
2 files changed, 63 insertions, 5 deletions
diff --git a/wifi/java/android/net/wifi/WifiManager.java b/wifi/java/android/net/wifi/WifiManager.java
index ec76a8b..a3c172a 100644
--- a/wifi/java/android/net/wifi/WifiManager.java
+++ b/wifi/java/android/net/wifi/WifiManager.java
@@ -70,6 +70,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.
* Another extra provides the previous state, if available.
diff --git a/wifi/java/android/net/wifi/WifiStateMachine.java b/wifi/java/android/net/wifi/WifiStateMachine.java
index 3e3752e..82f1084 100644
--- a/wifi/java/android/net/wifi/WifiStateMachine.java
+++ b/wifi/java/android/net/wifi/WifiStateMachine.java
@@ -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.
*/
@@ -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));
@@ -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);
}
/*********************************************************
@@ -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) {
@@ -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);
@@ -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:
@@ -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:
@@ -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:
@@ -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.
}
}
@@ -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:
@@ -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 */
@@ -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);
}