summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPawit Pornkitprasan <p.pawit@gmail.com>2013-12-29 08:54:55 +0700
committerSteve Kondik <steve@cyngn.com>2015-03-12 06:19:15 -0700
commitc608a6f968d415478668baf8a9d743ad57c0f845 (patch)
treedb36207cfe0865b824ff50132b5c2517b5c9b58f
parent2748784570cbe52f9bf75a2abaa7d9f8f4047117 (diff)
downloadandroid_frameworks_opt_net_wifi-c608a6f968d415478668baf8a9d743ad57c0f845.tar.gz
android_frameworks_opt_net_wifi-c608a6f968d415478668baf8a9d743ad57c0f845.tar.bz2
android_frameworks_opt_net_wifi-c608a6f968d415478668baf8a9d743ad57c0f845.zip
WifiController: fix high perf lock sometimes not respected
When the device screen is turned off, the state is DeviceActive for 15 minutes. In this time, high perf lock is not respected and Wi-Fi power-saving mode will be turned on because screen is off. Fix by adding a new DeviceActiveHighPerfState. Change-Id: I71074beec4d41286dea0861107d7931da205aca2 JIRA: CYAN-2860
-rw-r--r--service/java/com/android/server/wifi/WifiController.java34
1 files changed, 30 insertions, 4 deletions
diff --git a/service/java/com/android/server/wifi/WifiController.java b/service/java/com/android/server/wifi/WifiController.java
index 4b2152e66..c244162bd 100644
--- a/service/java/com/android/server/wifi/WifiController.java
+++ b/service/java/com/android/server/wifi/WifiController.java
@@ -123,6 +123,7 @@ class WifiController extends StateMachine {
private StaDisabledWithScanState mStaDisabledWithScanState = new StaDisabledWithScanState();
private ApEnabledState mApEnabledState = new ApEnabledState();
private DeviceActiveState mDeviceActiveState = new DeviceActiveState();
+ private DeviceActiveHighPerfState mDeviceActiveHighPerfState = new DeviceActiveHighPerfState();
private DeviceInactiveState mDeviceInactiveState = new DeviceInactiveState();
private ScanOnlyLockHeldState mScanOnlyLockHeldState = new ScanOnlyLockHeldState();
private FullLockHeldState mFullLockHeldState = new FullLockHeldState();
@@ -145,6 +146,7 @@ class WifiController extends StateMachine {
addState(mApStaDisabledState, mDefaultState);
addState(mStaEnabledState, mDefaultState);
addState(mDeviceActiveState, mStaEnabledState);
+ addState(mDeviceActiveHighPerfState, mDeviceActiveState);
addState(mDeviceInactiveState, mStaEnabledState);
addState(mScanOnlyLockHeldState, mDeviceInactiveState);
addState(mFullLockHeldState, mDeviceInactiveState);
@@ -416,7 +418,7 @@ class WifiController extends StateMachine {
break;
}
if (mDeviceIdle == false) {
- transitionTo(mDeviceActiveState);
+ checkLocksAndTransitionWhenDeviceActive();
} else {
checkLocksAndTransitionWhenDeviceIdle();
}
@@ -545,7 +547,7 @@ class WifiController extends StateMachine {
break;
}
if (mDeviceIdle == false) {
- transitionTo(mDeviceActiveState);
+ checkLocksAndTransitionWhenDeviceActive();
} else {
checkLocksAndTransitionWhenDeviceIdle();
}
@@ -635,7 +637,7 @@ class WifiController extends StateMachine {
if (msg.what == CMD_EMERGENCY_MODE_CHANGED && msg.arg1 == 0) {
if (mSettingsStore.isWifiToggleEnabled()) {
if (mDeviceIdle == false) {
- transitionTo(mDeviceActiveState);
+ checkLocksAndTransitionWhenDeviceActive();
} else {
checkLocksAndTransitionWhenDeviceIdle();
}
@@ -665,6 +667,9 @@ class WifiController extends StateMachine {
if (msg.what == CMD_DEVICE_IDLE) {
checkLocksAndTransitionWhenDeviceIdle();
// We let default state handle the rest of work
+ } else if (msg.what == CMD_LOCKS_CHANGED) {
+ checkLocksAndTransitionWhenDeviceActive();
+ return HANDLED;
} else if (msg.what == CMD_USER_PRESENT) {
// TLS networks can't connect until user unlocks keystore. KeyStore
// unlocks when the user punches PIN after the reboot. So use this
@@ -679,6 +684,16 @@ class WifiController extends StateMachine {
}
}
+ /* Parent: DeviceActiveState. Device is active, and an app is holding a high perf lock. */
+ class DeviceActiveHighPerfState extends State {
+ @Override
+ public void enter() {
+ mWifiStateMachine.setOperationalMode(WifiStateMachine.CONNECT_MODE);
+ mWifiStateMachine.setDriverStart(true);
+ mWifiStateMachine.setHighPerfModeEnabled(true);
+ }
+ }
+
/* Parent: StaEnabledState */
class DeviceInactiveState extends State {
@Override
@@ -689,7 +704,7 @@ class WifiController extends StateMachine {
updateBatteryWorkSource();
return HANDLED;
case CMD_SCREEN_ON:
- transitionTo(mDeviceActiveState);
+ checkLocksAndTransitionWhenDeviceActive();
// More work in default state
return NOT_HANDLED;
default:
@@ -735,6 +750,17 @@ class WifiController extends StateMachine {
}
}
+ private void checkLocksAndTransitionWhenDeviceActive() {
+ if (mLocks.hasLocks() && mLocks.getStrongestLockMode() == WIFI_MODE_FULL_HIGH_PERF) {
+ // It is possible for the screen to be off while the device is
+ // is active (mIdleMillis), so we need the high-perf mode
+ // otherwise powersaving mode will be turned on.
+ transitionTo(mDeviceActiveHighPerfState);
+ } else {
+ transitionTo(mDeviceActiveState);
+ }
+ }
+
private void checkLocksAndTransitionWhenDeviceIdle() {
if (mLocks.hasLocks()) {
switch (mLocks.getStrongestLockMode()) {