diff options
author | Pawit Pornkitprasan <p.pawit@gmail.com> | 2013-12-29 08:54:55 +0700 |
---|---|---|
committer | Steve Kondik <steve@cyngn.com> | 2015-03-12 06:19:15 -0700 |
commit | c608a6f968d415478668baf8a9d743ad57c0f845 (patch) | |
tree | db36207cfe0865b824ff50132b5c2517b5c9b58f | |
parent | 2748784570cbe52f9bf75a2abaa7d9f8f4047117 (diff) | |
download | android_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.java | 34 |
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()) { |