summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPawit Pornkitprasan <p.pawit@gmail.com>2013-12-29 08:54:55 +0700
committerMichael Bestas <mikeioannina@gmail.com>2017-01-01 23:10:27 +0200
commit42e583f04aa282771555548677cac575ca5894d1 (patch)
treeb815c20edfbbbb9b6bcb974add21f7a86b28e3c6
parent44158b55eaec48f9d92b179102952831975132dc (diff)
downloadandroid_frameworks_opt_net_wifi-42e583f04aa282771555548677cac575ca5894d1.tar.gz
android_frameworks_opt_net_wifi-42e583f04aa282771555548677cac575ca5894d1.tar.bz2
android_frameworks_opt_net_wifi-42e583f04aa282771555548677cac575ca5894d1.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 b98bf14cd..7f7e6fada 100644
--- a/service/java/com/android/server/wifi/WifiController.java
+++ b/service/java/com/android/server/wifi/WifiController.java
@@ -139,6 +139,7 @@ public class WifiController extends StateMachine {
private ApEnabledState mApEnabledState = new ApEnabledState();
private ApStaEnabledState mApStaEnabledState = new ApStaEnabledState();
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();
@@ -164,6 +165,7 @@ public class WifiController extends StateMachine {
addState(mStaEnabledState, mDefaultState);
addState(mApStaEnabledState, mDefaultState);
addState(mDeviceActiveState, mStaEnabledState);
+ addState(mDeviceActiveHighPerfState, mDeviceActiveState);
addState(mDeviceInactiveState, mStaEnabledState);
addState(mScanOnlyLockHeldState, mDeviceInactiveState);
addState(mFullLockHeldState, mDeviceInactiveState);
@@ -476,7 +478,7 @@ public class WifiController extends StateMachine {
break;
}
if (mDeviceIdle == false) {
- transitionTo(mDeviceActiveState);
+ checkLocksAndTransitionWhenDeviceActive();
} else {
checkLocksAndTransitionWhenDeviceIdle();
}
@@ -716,7 +718,7 @@ public class WifiController extends StateMachine {
break;
}
if (mDeviceIdle == false) {
- transitionTo(mDeviceActiveState);
+ checkLocksAndTransitionWhenDeviceActive();
} else {
checkLocksAndTransitionWhenDeviceIdle();
}
@@ -930,7 +932,7 @@ public class WifiController extends StateMachine {
if (exitEcm) {
if (mSettingsStore.isWifiToggleEnabled()) {
if (mDeviceIdle == false) {
- transitionTo(mDeviceActiveState);
+ checkLocksAndTransitionWhenDeviceActive();
} else {
checkLocksAndTransitionWhenDeviceIdle();
}
@@ -957,6 +959,9 @@ public 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
@@ -975,6 +980,16 @@ public 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
@@ -985,7 +1000,7 @@ public class WifiController extends StateMachine {
updateBatteryWorkSource();
return HANDLED;
case CMD_SCREEN_ON:
- transitionTo(mDeviceActiveState);
+ checkLocksAndTransitionWhenDeviceActive();
// More work in default state
return NOT_HANDLED;
default:
@@ -1031,6 +1046,17 @@ public 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() {
switch (mWifiLockManager.getStrongestLockMode()) {
case WIFI_MODE_NO_LOCKS_HELD: