summaryrefslogtreecommitdiffstats
path: root/service/java/com/android/server/wifi/WifiController.java
diff options
context:
space:
mode:
Diffstat (limited to 'service/java/com/android/server/wifi/WifiController.java')
-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()) {