111aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff/* 211aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff * Copyright (C) 2013 The Android Open Source Project 311aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff * 411aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff * Licensed under the Apache License, Version 2.0 (the "License"); 511aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff * you may not use this file except in compliance with the License. 611aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff * You may obtain a copy of the License at 711aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff * 811aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff * http://www.apache.org/licenses/LICENSE-2.0 911aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff * 1011aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff * Unless required by applicable law or agreed to in writing, software 1111aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff * distributed under the License is distributed on an "AS IS" BASIS, 1211aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1311aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff * See the License for the specific language governing permissions and 1411aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff * limitations under the License. 1511aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff */ 1611aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff 1711aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriffpackage com.android.server.wifi; 1811aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff 1911aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriffimport android.app.AlarmManager; 2011aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriffimport android.app.PendingIntent; 2111aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriffimport android.content.BroadcastReceiver; 2211aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriffimport android.content.Context; 2311aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriffimport android.content.Intent; 2411aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriffimport android.content.IntentFilter; 2511aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriffimport android.database.ContentObserver; 2611aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriffimport android.net.ConnectivityManager; 2711aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriffimport android.net.NetworkInfo; 2811aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriffimport android.net.wifi.WifiConfiguration; 2911aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriffimport android.net.wifi.WifiManager; 3011aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriffimport static android.net.wifi.WifiManager.WIFI_MODE_FULL; 3111aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriffimport static android.net.wifi.WifiManager.WIFI_MODE_FULL_HIGH_PERF; 3211aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriffimport static android.net.wifi.WifiManager.WIFI_MODE_SCAN_ONLY; 3311aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriffimport android.net.wifi.WifiStateMachine; 3411aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriffimport android.os.Handler; 3511aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriffimport android.os.Looper; 3611aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriffimport android.os.Message; 37c12783a90e08bd2e20eb75f68192fbf7bad80357Robert Greenwaltimport android.os.SystemClock; 3811aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriffimport android.os.WorkSource; 3911aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriffimport android.provider.Settings; 4011aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriffimport android.util.Slog; 4111aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff 4211aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriffimport com.android.internal.util.Protocol; 4311aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriffimport com.android.internal.util.State; 4411aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriffimport com.android.internal.util.StateMachine; 4511aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriffimport com.android.server.wifi.WifiService.LockList; 4611aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff 4711aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriffimport java.io.FileDescriptor; 4811aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriffimport java.io.PrintWriter; 4911aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff 5011aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriffclass WifiController extends StateMachine { 5111aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff private static final String TAG = "WifiController"; 5211aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff private static final boolean DBG = false; 5311aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff private Context mContext; 5411aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff private boolean mScreenOff; 5511aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff private boolean mDeviceIdle; 5611aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff private int mPluggedType; 5711aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff private int mStayAwakeConditions; 5811aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff private long mIdleMillis; 5911aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff private int mSleepPolicy; 60a3038b2b311cd07d851c404ccc5df2f4e07bcfd8Vinit Deshapnde private boolean mFirstUserSignOnSeen = false; 6111aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff 6211aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff private AlarmManager mAlarmManager; 6311aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff private PendingIntent mIdleIntent; 6411aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff private static final int IDLE_REQUEST = 0; 6511aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff 6611aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff /** 6711aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff * See {@link Settings.Global#WIFI_IDLE_MS}. This is the default value if a 6811aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff * Settings.Global value is not present. This timeout value is chosen as 6911aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff * the approximate point at which the battery drain caused by Wi-Fi 7011aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff * being enabled but not active exceeds the battery drain caused by 7111aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff * re-establishing a connection to the mobile data network. 7211aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff */ 7311aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff private static final long DEFAULT_IDLE_MS = 15 * 60 * 1000; /* 15 minutes */ 7411aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff 75c12783a90e08bd2e20eb75f68192fbf7bad80357Robert Greenwalt /** 76c12783a90e08bd2e20eb75f68192fbf7bad80357Robert Greenwalt * See {@link Settings.Global#WIFI_REENABLE_DELAY_MS}. This is the default value if a 77c12783a90e08bd2e20eb75f68192fbf7bad80357Robert Greenwalt * Settings.Global value is not present. This is the minimum time after wifi is disabled 78c12783a90e08bd2e20eb75f68192fbf7bad80357Robert Greenwalt * we'll act on an enable. Enable requests received before this delay will be deferred. 79c12783a90e08bd2e20eb75f68192fbf7bad80357Robert Greenwalt */ 80c12783a90e08bd2e20eb75f68192fbf7bad80357Robert Greenwalt private static final long DEFAULT_REENABLE_DELAY_MS = 500; 81c12783a90e08bd2e20eb75f68192fbf7bad80357Robert Greenwalt 82e47d7d43803926d86654a03d719c5551bc950690Robert Greenwalt // finding that delayed messages can sometimes be delivered earlier than expected 83e47d7d43803926d86654a03d719c5551bc950690Robert Greenwalt // probably rounding errors.. add a margin to prevent problems 84e47d7d43803926d86654a03d719c5551bc950690Robert Greenwalt private static final long DEFER_MARGIN_MS = 5; 85e47d7d43803926d86654a03d719c5551bc950690Robert Greenwalt 8611aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff NetworkInfo mNetworkInfo = new NetworkInfo(ConnectivityManager.TYPE_WIFI, 0, "WIFI", ""); 8711aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff 8811aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff private static final String ACTION_DEVICE_IDLE = 8911aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff "com.android.server.WifiManager.action.DEVICE_IDLE"; 9011aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff 9111aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff /* References to values tracked in WifiService */ 9211aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff final WifiStateMachine mWifiStateMachine; 9311aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff final WifiSettingsStore mSettingsStore; 9411aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff final LockList mLocks; 9511aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff 9611aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff /** 9711aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff * Temporary for computing UIDS that are responsible for starting WIFI. 9811aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff * Protected by mWifiStateTracker lock. 9911aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff */ 10011aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff private final WorkSource mTmpWorkSource = new WorkSource(); 10111aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff 102c12783a90e08bd2e20eb75f68192fbf7bad80357Robert Greenwalt private long mReEnableDelayMillis; 103c12783a90e08bd2e20eb75f68192fbf7bad80357Robert Greenwalt 10411aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff private static final int BASE = Protocol.BASE_WIFI_CONTROLLER; 10511aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff 10611aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff static final int CMD_EMERGENCY_MODE_CHANGED = BASE + 1; 10711aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff static final int CMD_SCREEN_ON = BASE + 2; 10811aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff static final int CMD_SCREEN_OFF = BASE + 3; 10911aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff static final int CMD_BATTERY_CHANGED = BASE + 4; 11011aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff static final int CMD_DEVICE_IDLE = BASE + 5; 11111aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff static final int CMD_LOCKS_CHANGED = BASE + 6; 11211aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff static final int CMD_SCAN_ALWAYS_MODE_CHANGED = BASE + 7; 11311aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff static final int CMD_WIFI_TOGGLED = BASE + 8; 11411aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff static final int CMD_AIRPLANE_TOGGLED = BASE + 9; 11511aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff static final int CMD_SET_AP = BASE + 10; 116c12783a90e08bd2e20eb75f68192fbf7bad80357Robert Greenwalt static final int CMD_DEFERRED_TOGGLE = BASE + 11; 117a3038b2b311cd07d851c404ccc5df2f4e07bcfd8Vinit Deshapnde static final int CMD_USER_PRESENT = BASE + 12; 11811aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff 11911aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff private DefaultState mDefaultState = new DefaultState(); 12011aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff private StaEnabledState mStaEnabledState = new StaEnabledState(); 12111aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff private ApStaDisabledState mApStaDisabledState = new ApStaDisabledState(); 12211aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff private StaDisabledWithScanState mStaDisabledWithScanState = new StaDisabledWithScanState(); 12311aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff private ApEnabledState mApEnabledState = new ApEnabledState(); 12411aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff private DeviceActiveState mDeviceActiveState = new DeviceActiveState(); 12511aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff private DeviceInactiveState mDeviceInactiveState = new DeviceInactiveState(); 12611aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff private ScanOnlyLockHeldState mScanOnlyLockHeldState = new ScanOnlyLockHeldState(); 12711aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff private FullLockHeldState mFullLockHeldState = new FullLockHeldState(); 12811aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff private FullHighPerfLockHeldState mFullHighPerfLockHeldState = new FullHighPerfLockHeldState(); 12911aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff private NoLockHeldState mNoLockHeldState = new NoLockHeldState(); 13011aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff private EcmState mEcmState = new EcmState(); 13111aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff 13211aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff WifiController(Context context, WifiService service, Looper looper) { 13311aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff super(TAG, looper); 13411aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff mContext = context; 13511aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff mWifiStateMachine = service.mWifiStateMachine; 13611aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff mSettingsStore = service.mSettingsStore; 13711aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff mLocks = service.mLocks; 13811aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff 13911aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff mAlarmManager = (AlarmManager)mContext.getSystemService(Context.ALARM_SERVICE); 14011aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff Intent idleIntent = new Intent(ACTION_DEVICE_IDLE, null); 14111aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff mIdleIntent = PendingIntent.getBroadcast(mContext, IDLE_REQUEST, idleIntent, 0); 14211aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff 14311aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff addState(mDefaultState); 14411aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff addState(mApStaDisabledState, mDefaultState); 14511aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff addState(mStaEnabledState, mDefaultState); 14611aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff addState(mDeviceActiveState, mStaEnabledState); 14711aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff addState(mDeviceInactiveState, mStaEnabledState); 14811aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff addState(mScanOnlyLockHeldState, mDeviceInactiveState); 14911aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff addState(mFullLockHeldState, mDeviceInactiveState); 15011aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff addState(mFullHighPerfLockHeldState, mDeviceInactiveState); 15111aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff addState(mNoLockHeldState, mDeviceInactiveState); 15211aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff addState(mStaDisabledWithScanState, mDefaultState); 15311aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff addState(mApEnabledState, mDefaultState); 15411aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff addState(mEcmState, mDefaultState); 15505caa2a3de32e54562d1ec3031f73ef5392cfb40Robert Greenwalt if (mSettingsStore.isScanAlwaysAvailable()) { 15605caa2a3de32e54562d1ec3031f73ef5392cfb40Robert Greenwalt setInitialState(mStaDisabledWithScanState); 15705caa2a3de32e54562d1ec3031f73ef5392cfb40Robert Greenwalt } else { 15805caa2a3de32e54562d1ec3031f73ef5392cfb40Robert Greenwalt setInitialState(mApStaDisabledState); 15905caa2a3de32e54562d1ec3031f73ef5392cfb40Robert Greenwalt } 16002ba86f0cc34fcaaf5e938f178c9d0ff86c8dba0Robert Greenwalt setLogRecSize(100); 16102ba86f0cc34fcaaf5e938f178c9d0ff86c8dba0Robert Greenwalt setLogOnlyTransitions(false); 16211aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff 16311aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff IntentFilter filter = new IntentFilter(); 16411aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff filter.addAction(ACTION_DEVICE_IDLE); 16511aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff filter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION); 16611aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff mContext.registerReceiver( 16711aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff new BroadcastReceiver() { 16811aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff @Override 16911aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff public void onReceive(Context context, Intent intent) { 17011aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff String action = intent.getAction(); 17111aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff if (action.equals(ACTION_DEVICE_IDLE)) { 17211aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff sendMessage(CMD_DEVICE_IDLE); 17311aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff } else if (action.equals(WifiManager.NETWORK_STATE_CHANGED_ACTION)) { 17411aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff mNetworkInfo = (NetworkInfo) intent.getParcelableExtra( 17511aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff WifiManager.EXTRA_NETWORK_INFO); 17611aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff } 17711aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff } 17811aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff }, 17911aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff new IntentFilter(filter)); 18011aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff 18111aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff initializeAndRegisterForSettingsChange(looper); 18211aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff } 18311aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff 18411aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff private void initializeAndRegisterForSettingsChange(Looper looper) { 18511aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff Handler handler = new Handler(looper); 18611aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff readStayAwakeConditions(); 18711aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff registerForStayAwakeModeChange(handler); 18811aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff readWifiIdleTime(); 18911aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff registerForWifiIdleTimeChange(handler); 1909f2e83135c046ab475a101ae7c020d94db8f53d9Irfan Sheriff readWifiSleepPolicy(); 19111aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff registerForWifiSleepPolicyChange(handler); 192c12783a90e08bd2e20eb75f68192fbf7bad80357Robert Greenwalt readWifiReEnableDelay(); 19311aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff } 19411aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff 19511aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff private void readStayAwakeConditions() { 19611aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff mStayAwakeConditions = Settings.Global.getInt(mContext.getContentResolver(), 19711aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff Settings.Global.STAY_ON_WHILE_PLUGGED_IN, 0); 19811aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff } 19911aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff 20011aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff private void readWifiIdleTime() { 20111aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff mIdleMillis = Settings.Global.getLong(mContext.getContentResolver(), 20211aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff Settings.Global.WIFI_IDLE_MS, DEFAULT_IDLE_MS); 20311aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff } 20411aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff 20511aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff private void readWifiSleepPolicy() { 20611aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff mSleepPolicy = Settings.Global.getInt(mContext.getContentResolver(), 20711aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff Settings.Global.WIFI_SLEEP_POLICY, 20811aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff Settings.Global.WIFI_SLEEP_POLICY_NEVER); 20911aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff } 21011aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff 211c12783a90e08bd2e20eb75f68192fbf7bad80357Robert Greenwalt private void readWifiReEnableDelay() { 212c12783a90e08bd2e20eb75f68192fbf7bad80357Robert Greenwalt mReEnableDelayMillis = Settings.Global.getLong(mContext.getContentResolver(), 213c12783a90e08bd2e20eb75f68192fbf7bad80357Robert Greenwalt Settings.Global.WIFI_REENABLE_DELAY_MS, DEFAULT_REENABLE_DELAY_MS); 214c12783a90e08bd2e20eb75f68192fbf7bad80357Robert Greenwalt } 215c12783a90e08bd2e20eb75f68192fbf7bad80357Robert Greenwalt 21611aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff /** 21711aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff * Observes settings changes to scan always mode. 21811aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff */ 21911aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff private void registerForStayAwakeModeChange(Handler handler) { 22011aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff ContentObserver contentObserver = new ContentObserver(handler) { 22111aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff @Override 22211aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff public void onChange(boolean selfChange) { 22311aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff readStayAwakeConditions(); 22411aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff } 22511aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff }; 22611aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff 22711aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff mContext.getContentResolver().registerContentObserver( 22811aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff Settings.Global.getUriFor(Settings.Global.STAY_ON_WHILE_PLUGGED_IN), 22911aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff false, contentObserver); 23011aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff } 23111aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff 23211aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff /** 23311aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff * Observes settings changes to scan always mode. 23411aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff */ 23511aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff private void registerForWifiIdleTimeChange(Handler handler) { 23611aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff ContentObserver contentObserver = new ContentObserver(handler) { 23711aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff @Override 23811aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff public void onChange(boolean selfChange) { 23911aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff readWifiIdleTime(); 24011aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff } 24111aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff }; 24211aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff 24311aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff mContext.getContentResolver().registerContentObserver( 24411aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff Settings.Global.getUriFor(Settings.Global.WIFI_IDLE_MS), 24511aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff false, contentObserver); 24611aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff } 24711aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff 24811aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff /** 24911aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff * Observes changes to wifi sleep policy 25011aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff */ 25111aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff private void registerForWifiSleepPolicyChange(Handler handler) { 25211aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff ContentObserver contentObserver = new ContentObserver(handler) { 25311aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff @Override 25411aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff public void onChange(boolean selfChange) { 25511aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff readWifiSleepPolicy(); 25611aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff } 25711aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff }; 25811aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff mContext.getContentResolver().registerContentObserver( 25911aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff Settings.Global.getUriFor(Settings.Global.WIFI_SLEEP_POLICY), 26011aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff false, contentObserver); 26111aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff } 26211aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff 26311aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff /** 26411aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff * Determines whether the Wi-Fi chipset should stay awake or be put to 26511aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff * sleep. Looks at the setting for the sleep policy and the current 26611aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff * conditions. 26711aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff * 26811aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff * @see #shouldDeviceStayAwake(int) 26911aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff */ 27011aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff private boolean shouldWifiStayAwake(int pluggedType) { 27111aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff if (mSleepPolicy == Settings.Global.WIFI_SLEEP_POLICY_NEVER) { 27211aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff // Never sleep 27311aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff return true; 27411aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff } else if ((mSleepPolicy == Settings.Global.WIFI_SLEEP_POLICY_NEVER_WHILE_PLUGGED) && 27511aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff (pluggedType != 0)) { 27611aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff // Never sleep while plugged, and we're plugged 27711aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff return true; 27811aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff } else { 27911aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff // Default 28011aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff return shouldDeviceStayAwake(pluggedType); 28111aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff } 28211aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff } 28311aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff 28411aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff /** 28511aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff * Determine whether the bit value corresponding to {@code pluggedType} is set in 28611aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff * the bit string mStayAwakeConditions. This determines whether the device should 28711aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff * stay awake based on the current plugged type. 28811aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff * 28911aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff * @param pluggedType the type of plug (USB, AC, or none) for which the check is 29011aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff * being made 29111aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff * @return {@code true} if {@code pluggedType} indicates that the device is 29211aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff * supposed to stay awake, {@code false} otherwise. 29311aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff */ 29411aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff private boolean shouldDeviceStayAwake(int pluggedType) { 29511aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff return (mStayAwakeConditions & pluggedType) != 0; 29611aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff } 29711aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff 29811aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff private void updateBatteryWorkSource() { 29911aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff mTmpWorkSource.clear(); 30011aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff if (mDeviceIdle) { 30111aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff mLocks.updateWorkSource(mTmpWorkSource); 30211aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff } 30311aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff mWifiStateMachine.updateBatteryWorkSource(mTmpWorkSource); 30411aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff } 30511aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff 30611aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff class DefaultState extends State { 30711aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff @Override 30811aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff public boolean processMessage(Message msg) { 30911aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff switch (msg.what) { 31011aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff case CMD_SCREEN_ON: 31111aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff mAlarmManager.cancel(mIdleIntent); 31211aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff mScreenOff = false; 31311aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff mDeviceIdle = false; 31411aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff updateBatteryWorkSource(); 31511aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff break; 31611aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff case CMD_SCREEN_OFF: 31711aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff mScreenOff = true; 31811aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff /* 31911aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff * Set a timer to put Wi-Fi to sleep, but only if the screen is off 32011aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff * AND the "stay on while plugged in" setting doesn't match the 32111aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff * current power conditions (i.e, not plugged in, plugged in to USB, 32211aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff * or plugged in to AC). 32311aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff */ 32411aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff if (!shouldWifiStayAwake(mPluggedType)) { 32511aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff //Delayed shutdown if wifi is connected 32611aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff if (mNetworkInfo.getDetailedState() == 32711aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff NetworkInfo.DetailedState.CONNECTED) { 32811aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff if (DBG) Slog.d(TAG, "set idle timer: " + mIdleMillis + " ms"); 32911aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff mAlarmManager.set(AlarmManager.RTC_WAKEUP, 33011aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff System.currentTimeMillis() + mIdleMillis, mIdleIntent); 33111aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff } else { 33211aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff sendMessage(CMD_DEVICE_IDLE); 33311aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff } 33411aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff } 33511aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff break; 33611aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff case CMD_DEVICE_IDLE: 33711aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff mDeviceIdle = true; 33811aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff updateBatteryWorkSource(); 33911aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff break; 34011aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff case CMD_BATTERY_CHANGED: 34111aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff /* 34211aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff * Set a timer to put Wi-Fi to sleep, but only if the screen is off 34311aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff * AND we are transitioning from a state in which the device was supposed 34411aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff * to stay awake to a state in which it is not supposed to stay awake. 34511aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff * If "stay awake" state is not changing, we do nothing, to avoid resetting 34611aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff * the already-set timer. 34711aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff */ 34811aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff int pluggedType = msg.arg1; 34911aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff if (DBG) Slog.d(TAG, "battery changed pluggedType: " + pluggedType); 35011aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff if (mScreenOff && shouldWifiStayAwake(mPluggedType) && 35111aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff !shouldWifiStayAwake(pluggedType)) { 35211aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff long triggerTime = System.currentTimeMillis() + mIdleMillis; 35311aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff if (DBG) Slog.d(TAG, "set idle timer for " + mIdleMillis + "ms"); 35411aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff mAlarmManager.set(AlarmManager.RTC_WAKEUP, triggerTime, mIdleIntent); 35511aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff } 35611aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff 35711aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff mPluggedType = pluggedType; 35811aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff break; 35911aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff case CMD_SET_AP: 36011aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff case CMD_SCAN_ALWAYS_MODE_CHANGED: 36111aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff case CMD_LOCKS_CHANGED: 36211aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff case CMD_WIFI_TOGGLED: 36311aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff case CMD_AIRPLANE_TOGGLED: 36411aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff case CMD_EMERGENCY_MODE_CHANGED: 36502ba86f0cc34fcaaf5e938f178c9d0ff86c8dba0Robert Greenwalt break; 366a3038b2b311cd07d851c404ccc5df2f4e07bcfd8Vinit Deshapnde case CMD_USER_PRESENT: 367a3038b2b311cd07d851c404ccc5df2f4e07bcfd8Vinit Deshapnde mFirstUserSignOnSeen = true; 368a3038b2b311cd07d851c404ccc5df2f4e07bcfd8Vinit Deshapnde break; 369c12783a90e08bd2e20eb75f68192fbf7bad80357Robert Greenwalt case CMD_DEFERRED_TOGGLE: 37002ba86f0cc34fcaaf5e938f178c9d0ff86c8dba0Robert Greenwalt log("DEFERRED_TOGGLE ignored due to state change"); 37111aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff break; 37211aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff default: 37311aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff throw new RuntimeException("WifiController.handleMessage " + msg.what); 37411aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff } 37511aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff return HANDLED; 37611aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff } 37711aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff 37811aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff } 37911aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff 38011aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff class ApStaDisabledState extends State { 381c12783a90e08bd2e20eb75f68192fbf7bad80357Robert Greenwalt private int mDeferredEnableSerialNumber = 0; 382c12783a90e08bd2e20eb75f68192fbf7bad80357Robert Greenwalt private boolean mHaveDeferredEnable = false; 383c12783a90e08bd2e20eb75f68192fbf7bad80357Robert Greenwalt private long mDisabledTimestamp; 384c12783a90e08bd2e20eb75f68192fbf7bad80357Robert Greenwalt 38511aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff @Override 38611aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff public void enter() { 38711aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff mWifiStateMachine.setSupplicantRunning(false); 388c12783a90e08bd2e20eb75f68192fbf7bad80357Robert Greenwalt // Supplicant can't restart right away, so not the time we switched off 389c12783a90e08bd2e20eb75f68192fbf7bad80357Robert Greenwalt mDisabledTimestamp = SystemClock.elapsedRealtime(); 390c12783a90e08bd2e20eb75f68192fbf7bad80357Robert Greenwalt mDeferredEnableSerialNumber++; 391c12783a90e08bd2e20eb75f68192fbf7bad80357Robert Greenwalt mHaveDeferredEnable = false; 39211aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff } 39311aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff @Override 39411aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff public boolean processMessage(Message msg) { 39511aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff switch (msg.what) { 39611aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff case CMD_WIFI_TOGGLED: 39711aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff case CMD_AIRPLANE_TOGGLED: 39811aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff if (mSettingsStore.isWifiToggleEnabled()) { 399c12783a90e08bd2e20eb75f68192fbf7bad80357Robert Greenwalt if (doDeferEnable(msg)) { 400c12783a90e08bd2e20eb75f68192fbf7bad80357Robert Greenwalt if (mHaveDeferredEnable) { 401c12783a90e08bd2e20eb75f68192fbf7bad80357Robert Greenwalt // have 2 toggles now, inc serial number an ignore both 402c12783a90e08bd2e20eb75f68192fbf7bad80357Robert Greenwalt mDeferredEnableSerialNumber++; 403c12783a90e08bd2e20eb75f68192fbf7bad80357Robert Greenwalt } 404c12783a90e08bd2e20eb75f68192fbf7bad80357Robert Greenwalt mHaveDeferredEnable = !mHaveDeferredEnable; 405c12783a90e08bd2e20eb75f68192fbf7bad80357Robert Greenwalt break; 406c12783a90e08bd2e20eb75f68192fbf7bad80357Robert Greenwalt } 40711aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff if (mDeviceIdle == false) { 40811aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff transitionTo(mDeviceActiveState); 40911aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff } else { 41011aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff checkLocksAndTransitionWhenDeviceIdle(); 41111aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff } 41211aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff } 41311aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff break; 41411aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff case CMD_SCAN_ALWAYS_MODE_CHANGED: 41511aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff if (mSettingsStore.isScanAlwaysAvailable()) { 41611aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff transitionTo(mStaDisabledWithScanState); 41711aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff } 41811aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff break; 41911aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff case CMD_SET_AP: 42011aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff if (msg.arg1 == 1) { 42111aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff mWifiStateMachine.setHostApRunning((WifiConfiguration) msg.obj, 42211aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff true); 42311aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff transitionTo(mApEnabledState); 42411aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff } 42511aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff break; 426c12783a90e08bd2e20eb75f68192fbf7bad80357Robert Greenwalt case CMD_DEFERRED_TOGGLE: 42702ba86f0cc34fcaaf5e938f178c9d0ff86c8dba0Robert Greenwalt if (msg.arg1 != mDeferredEnableSerialNumber) { 42802ba86f0cc34fcaaf5e938f178c9d0ff86c8dba0Robert Greenwalt log("DEFERRED_TOGGLE ignored due to serial mismatch"); 42902ba86f0cc34fcaaf5e938f178c9d0ff86c8dba0Robert Greenwalt break; 43002ba86f0cc34fcaaf5e938f178c9d0ff86c8dba0Robert Greenwalt } 43102ba86f0cc34fcaaf5e938f178c9d0ff86c8dba0Robert Greenwalt log("DEFERRED_TOGGLE handled"); 432c12783a90e08bd2e20eb75f68192fbf7bad80357Robert Greenwalt sendMessage((Message)(msg.obj)); 433c12783a90e08bd2e20eb75f68192fbf7bad80357Robert Greenwalt break; 43411aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff default: 43511aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff return NOT_HANDLED; 43611aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff } 43711aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff return HANDLED; 43811aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff } 43911aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff 440c12783a90e08bd2e20eb75f68192fbf7bad80357Robert Greenwalt private boolean doDeferEnable(Message msg) { 441c12783a90e08bd2e20eb75f68192fbf7bad80357Robert Greenwalt long delaySoFar = SystemClock.elapsedRealtime() - mDisabledTimestamp; 4425c11e8ee5463b88907814e3e8716af292f90fb86Robert Greenwalt if (delaySoFar >= mReEnableDelayMillis) { 443c12783a90e08bd2e20eb75f68192fbf7bad80357Robert Greenwalt return false; 444c12783a90e08bd2e20eb75f68192fbf7bad80357Robert Greenwalt } 445c12783a90e08bd2e20eb75f68192fbf7bad80357Robert Greenwalt 44602ba86f0cc34fcaaf5e938f178c9d0ff86c8dba0Robert Greenwalt log("WifiController msg " + msg + " deferred for " + 44702ba86f0cc34fcaaf5e938f178c9d0ff86c8dba0Robert Greenwalt (mReEnableDelayMillis - delaySoFar) + "ms"); 44802ba86f0cc34fcaaf5e938f178c9d0ff86c8dba0Robert Greenwalt 449c12783a90e08bd2e20eb75f68192fbf7bad80357Robert Greenwalt // need to defer this action. 450c12783a90e08bd2e20eb75f68192fbf7bad80357Robert Greenwalt Message deferredMsg = obtainMessage(CMD_DEFERRED_TOGGLE); 451c12783a90e08bd2e20eb75f68192fbf7bad80357Robert Greenwalt deferredMsg.obj = Message.obtain(msg); 452c12783a90e08bd2e20eb75f68192fbf7bad80357Robert Greenwalt deferredMsg.arg1 = ++mDeferredEnableSerialNumber; 453e47d7d43803926d86654a03d719c5551bc950690Robert Greenwalt sendMessageDelayed(deferredMsg, mReEnableDelayMillis - delaySoFar + DEFER_MARGIN_MS); 454c12783a90e08bd2e20eb75f68192fbf7bad80357Robert Greenwalt return true; 455c12783a90e08bd2e20eb75f68192fbf7bad80357Robert Greenwalt } 456c12783a90e08bd2e20eb75f68192fbf7bad80357Robert Greenwalt 45711aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff } 45811aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff 45911aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff class StaEnabledState extends State { 46011aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff @Override 46111aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff public void enter() { 46211aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff mWifiStateMachine.setSupplicantRunning(true); 46311aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff } 46411aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff @Override 46511aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff public boolean processMessage(Message msg) { 46611aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff switch (msg.what) { 46711aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff case CMD_WIFI_TOGGLED: 46811aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff if (! mSettingsStore.isWifiToggleEnabled()) { 46911aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff if (mSettingsStore.isScanAlwaysAvailable()) { 47011aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff transitionTo(mStaDisabledWithScanState); 47111aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff } else { 47211aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff transitionTo(mApStaDisabledState); 47311aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff } 47411aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff } 47511aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff break; 47611aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff case CMD_AIRPLANE_TOGGLED: 47711aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff /* When wi-fi is turned off due to airplane, 47811aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff * disable entirely (including scan) 47911aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff */ 48011aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff if (! mSettingsStore.isWifiToggleEnabled()) { 48111aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff transitionTo(mApStaDisabledState); 48211aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff } 48311aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff break; 48411aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff case CMD_EMERGENCY_MODE_CHANGED: 48511aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff if (msg.arg1 == 1) { 48611aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff transitionTo(mEcmState); 48711aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff break; 48811aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff } 48911aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff default: 49011aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff return NOT_HANDLED; 49111aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff 49211aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff } 49311aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff return HANDLED; 49411aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff } 49511aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff } 49611aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff 49711aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff class StaDisabledWithScanState extends State { 498c12783a90e08bd2e20eb75f68192fbf7bad80357Robert Greenwalt private int mDeferredEnableSerialNumber = 0; 499c12783a90e08bd2e20eb75f68192fbf7bad80357Robert Greenwalt private boolean mHaveDeferredEnable = false; 500c12783a90e08bd2e20eb75f68192fbf7bad80357Robert Greenwalt private long mDisabledTimestamp; 501c12783a90e08bd2e20eb75f68192fbf7bad80357Robert Greenwalt 50211aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff @Override 50311aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff public void enter() { 50411aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff mWifiStateMachine.setSupplicantRunning(true); 50511aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff mWifiStateMachine.setOperationalMode(WifiStateMachine.SCAN_ONLY_WITH_WIFI_OFF_MODE); 50611aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff mWifiStateMachine.setDriverStart(true); 507c12783a90e08bd2e20eb75f68192fbf7bad80357Robert Greenwalt // Supplicant can't restart right away, so not the time we switched off 508c12783a90e08bd2e20eb75f68192fbf7bad80357Robert Greenwalt mDisabledTimestamp = SystemClock.elapsedRealtime(); 509c12783a90e08bd2e20eb75f68192fbf7bad80357Robert Greenwalt mDeferredEnableSerialNumber++; 510c12783a90e08bd2e20eb75f68192fbf7bad80357Robert Greenwalt mHaveDeferredEnable = false; 51111aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff } 51211aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff 51311aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff @Override 51411aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff public boolean processMessage(Message msg) { 51511aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff switch (msg.what) { 51611aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff case CMD_WIFI_TOGGLED: 51711aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff if (mSettingsStore.isWifiToggleEnabled()) { 518c12783a90e08bd2e20eb75f68192fbf7bad80357Robert Greenwalt if (doDeferEnable(msg)) { 519c12783a90e08bd2e20eb75f68192fbf7bad80357Robert Greenwalt if (mHaveDeferredEnable) { 520c12783a90e08bd2e20eb75f68192fbf7bad80357Robert Greenwalt // have 2 toggles now, inc serial number and ignore both 521c12783a90e08bd2e20eb75f68192fbf7bad80357Robert Greenwalt mDeferredEnableSerialNumber++; 522c12783a90e08bd2e20eb75f68192fbf7bad80357Robert Greenwalt } 523c12783a90e08bd2e20eb75f68192fbf7bad80357Robert Greenwalt mHaveDeferredEnable = !mHaveDeferredEnable; 524c12783a90e08bd2e20eb75f68192fbf7bad80357Robert Greenwalt break; 525c12783a90e08bd2e20eb75f68192fbf7bad80357Robert Greenwalt } 52611aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff if (mDeviceIdle == false) { 52711aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff transitionTo(mDeviceActiveState); 52811aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff } else { 52911aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff checkLocksAndTransitionWhenDeviceIdle(); 53011aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff } 53111aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff } 53211aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff break; 53311aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff case CMD_AIRPLANE_TOGGLED: 53411aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff if (mSettingsStore.isAirplaneModeOn() && 53511aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff ! mSettingsStore.isWifiToggleEnabled()) { 53611aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff transitionTo(mApStaDisabledState); 53711aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff } 53811aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff case CMD_SCAN_ALWAYS_MODE_CHANGED: 53911aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff if (! mSettingsStore.isScanAlwaysAvailable()) { 54011aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff transitionTo(mApStaDisabledState); 54111aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff } 54211aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff break; 54311aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff case CMD_SET_AP: 54411aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff // Before starting tethering, turn off supplicant for scan mode 54511aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff if (msg.arg1 == 1) { 54611aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff deferMessage(msg); 54711aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff transitionTo(mApStaDisabledState); 54811aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff } 54911aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff break; 550c12783a90e08bd2e20eb75f68192fbf7bad80357Robert Greenwalt case CMD_DEFERRED_TOGGLE: 55102ba86f0cc34fcaaf5e938f178c9d0ff86c8dba0Robert Greenwalt if (msg.arg1 != mDeferredEnableSerialNumber) { 55202ba86f0cc34fcaaf5e938f178c9d0ff86c8dba0Robert Greenwalt log("DEFERRED_TOGGLE ignored due to serial mismatch"); 55302ba86f0cc34fcaaf5e938f178c9d0ff86c8dba0Robert Greenwalt break; 55402ba86f0cc34fcaaf5e938f178c9d0ff86c8dba0Robert Greenwalt } 55502ba86f0cc34fcaaf5e938f178c9d0ff86c8dba0Robert Greenwalt logd("DEFERRED_TOGGLE handled"); 556c12783a90e08bd2e20eb75f68192fbf7bad80357Robert Greenwalt sendMessage((Message)(msg.obj)); 557c12783a90e08bd2e20eb75f68192fbf7bad80357Robert Greenwalt break; 55811aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff default: 55911aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff return NOT_HANDLED; 56011aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff } 56111aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff return HANDLED; 56211aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff } 563c12783a90e08bd2e20eb75f68192fbf7bad80357Robert Greenwalt 564c12783a90e08bd2e20eb75f68192fbf7bad80357Robert Greenwalt private boolean doDeferEnable(Message msg) { 565c12783a90e08bd2e20eb75f68192fbf7bad80357Robert Greenwalt long delaySoFar = SystemClock.elapsedRealtime() - mDisabledTimestamp; 5665c11e8ee5463b88907814e3e8716af292f90fb86Robert Greenwalt if (delaySoFar >= mReEnableDelayMillis) { 567c12783a90e08bd2e20eb75f68192fbf7bad80357Robert Greenwalt return false; 568c12783a90e08bd2e20eb75f68192fbf7bad80357Robert Greenwalt } 56902ba86f0cc34fcaaf5e938f178c9d0ff86c8dba0Robert Greenwalt 57002ba86f0cc34fcaaf5e938f178c9d0ff86c8dba0Robert Greenwalt log("WifiController msg " + msg + " deferred for " + 57102ba86f0cc34fcaaf5e938f178c9d0ff86c8dba0Robert Greenwalt (mReEnableDelayMillis - delaySoFar) + "ms"); 57202ba86f0cc34fcaaf5e938f178c9d0ff86c8dba0Robert Greenwalt 573c12783a90e08bd2e20eb75f68192fbf7bad80357Robert Greenwalt // need to defer this action. 574c12783a90e08bd2e20eb75f68192fbf7bad80357Robert Greenwalt Message deferredMsg = obtainMessage(CMD_DEFERRED_TOGGLE); 575c12783a90e08bd2e20eb75f68192fbf7bad80357Robert Greenwalt deferredMsg.obj = Message.obtain(msg); 576c12783a90e08bd2e20eb75f68192fbf7bad80357Robert Greenwalt deferredMsg.arg1 = ++mDeferredEnableSerialNumber; 577e47d7d43803926d86654a03d719c5551bc950690Robert Greenwalt sendMessageDelayed(deferredMsg, mReEnableDelayMillis - delaySoFar + DEFER_MARGIN_MS); 578c12783a90e08bd2e20eb75f68192fbf7bad80357Robert Greenwalt return true; 579c12783a90e08bd2e20eb75f68192fbf7bad80357Robert Greenwalt } 580c12783a90e08bd2e20eb75f68192fbf7bad80357Robert Greenwalt 58111aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff } 58211aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff 58311aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff class ApEnabledState extends State { 58411aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff @Override 58511aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff public boolean processMessage(Message msg) { 58611aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff switch (msg.what) { 58711aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff case CMD_AIRPLANE_TOGGLED: 58811aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff if (mSettingsStore.isAirplaneModeOn()) { 58911aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff mWifiStateMachine.setHostApRunning(null, false); 59011aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff transitionTo(mApStaDisabledState); 59111aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff } 59211aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff break; 59311aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff case CMD_SET_AP: 59411aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff if (msg.arg1 == 0) { 59511aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff mWifiStateMachine.setHostApRunning(null, false); 59611aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff transitionTo(mApStaDisabledState); 59711aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff } 59811aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff break; 59911aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff default: 60011aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff return NOT_HANDLED; 60111aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff } 60211aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff return HANDLED; 60311aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff } 60411aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff } 60511aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff 60611aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff class EcmState extends State { 60711aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff @Override 60811aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff public void enter() { 60911aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff mWifiStateMachine.setSupplicantRunning(false); 61011aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff } 61111aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff 61211aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff @Override 61311aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff public boolean processMessage(Message msg) { 61411aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff if (msg.what == CMD_EMERGENCY_MODE_CHANGED && msg.arg1 == 0) { 61511aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff if (mSettingsStore.isWifiToggleEnabled()) { 61611aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff if (mDeviceIdle == false) { 61711aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff transitionTo(mDeviceActiveState); 61811aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff } else { 61911aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff checkLocksAndTransitionWhenDeviceIdle(); 62011aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff } 62111aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff } else if (mSettingsStore.isScanAlwaysAvailable()) { 62211aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff transitionTo(mStaDisabledWithScanState); 62311aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff } else { 62411aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff transitionTo(mApStaDisabledState); 62511aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff } 62611aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff return HANDLED; 62711aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff } else { 62811aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff return NOT_HANDLED; 62911aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff } 63011aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff } 63111aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff } 63211aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff 63311aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff /* Parent: StaEnabledState */ 63411aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff class DeviceActiveState extends State { 63511aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff @Override 63611aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff public void enter() { 63711aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff mWifiStateMachine.setOperationalMode(WifiStateMachine.CONNECT_MODE); 63811aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff mWifiStateMachine.setDriverStart(true); 63911aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff mWifiStateMachine.setHighPerfModeEnabled(false); 64011aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff } 64111aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff 64211aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff @Override 64311aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff public boolean processMessage(Message msg) { 64411aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff if (msg.what == CMD_DEVICE_IDLE) { 64511aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff checkLocksAndTransitionWhenDeviceIdle(); 64611aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff // We let default state handle the rest of work 647a3038b2b311cd07d851c404ccc5df2f4e07bcfd8Vinit Deshapnde } else if (msg.what == CMD_USER_PRESENT) { 648a3038b2b311cd07d851c404ccc5df2f4e07bcfd8Vinit Deshapnde // TLS networks can't connect until user unlocks keystore. KeyStore 649a3038b2b311cd07d851c404ccc5df2f4e07bcfd8Vinit Deshapnde // unlocks when the user punches PIN after the reboot. So use this 650a3038b2b311cd07d851c404ccc5df2f4e07bcfd8Vinit Deshapnde // trigger to get those networks connected. 651a3038b2b311cd07d851c404ccc5df2f4e07bcfd8Vinit Deshapnde if (mFirstUserSignOnSeen == false) { 652a3038b2b311cd07d851c404ccc5df2f4e07bcfd8Vinit Deshapnde mWifiStateMachine.reloadTlsNetworksAndReconnect(); 653a3038b2b311cd07d851c404ccc5df2f4e07bcfd8Vinit Deshapnde } 654a3038b2b311cd07d851c404ccc5df2f4e07bcfd8Vinit Deshapnde mFirstUserSignOnSeen = true; 655a3038b2b311cd07d851c404ccc5df2f4e07bcfd8Vinit Deshapnde return HANDLED; 65611aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff } 65711aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff return NOT_HANDLED; 65811aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff } 65911aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff } 66011aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff 66111aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff /* Parent: StaEnabledState */ 66211aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff class DeviceInactiveState extends State { 66311aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff @Override 66411aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff public boolean processMessage(Message msg) { 66511aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff switch (msg.what) { 66611aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff case CMD_LOCKS_CHANGED: 66711aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff checkLocksAndTransitionWhenDeviceIdle(); 66811aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff updateBatteryWorkSource(); 66911aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff return HANDLED; 67011aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff case CMD_SCREEN_ON: 67111aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff transitionTo(mDeviceActiveState); 67211aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff // More work in default state 67311aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff return NOT_HANDLED; 67411aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff default: 67511aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff return NOT_HANDLED; 67611aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff } 67711aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff } 67811aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff } 67911aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff 68011aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff /* Parent: DeviceInactiveState. Device is inactive, but an app is holding a scan only lock. */ 68111aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff class ScanOnlyLockHeldState extends State { 68211aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff @Override 68311aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff public void enter() { 68411aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff mWifiStateMachine.setOperationalMode(WifiStateMachine.SCAN_ONLY_MODE); 68511aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff mWifiStateMachine.setDriverStart(true); 68611aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff } 68711aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff } 68811aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff 68911aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff /* Parent: DeviceInactiveState. Device is inactive, but an app is holding a full lock. */ 69011aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff class FullLockHeldState extends State { 69111aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff @Override 69211aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff public void enter() { 69311aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff mWifiStateMachine.setOperationalMode(WifiStateMachine.CONNECT_MODE); 69411aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff mWifiStateMachine.setDriverStart(true); 69511aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff mWifiStateMachine.setHighPerfModeEnabled(false); 69611aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff } 69711aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff } 69811aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff 69911aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff /* Parent: DeviceInactiveState. Device is inactive, but an app is holding a high perf lock. */ 70011aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff class FullHighPerfLockHeldState extends State { 70111aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff @Override 70211aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff public void enter() { 70311aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff mWifiStateMachine.setOperationalMode(WifiStateMachine.CONNECT_MODE); 70411aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff mWifiStateMachine.setDriverStart(true); 70511aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff mWifiStateMachine.setHighPerfModeEnabled(true); 70611aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff } 70711aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff } 70811aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff 70911aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff /* Parent: DeviceInactiveState. Device is inactive and no app is holding a wifi lock. */ 71011aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff class NoLockHeldState extends State { 71111aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff @Override 71211aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff public void enter() { 71311aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff mWifiStateMachine.setDriverStart(false); 71411aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff } 71511aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff } 71611aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff 71711aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff private void checkLocksAndTransitionWhenDeviceIdle() { 71811aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff if (mLocks.hasLocks()) { 71911aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff switch (mLocks.getStrongestLockMode()) { 72011aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff case WIFI_MODE_FULL: 72111aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff transitionTo(mFullLockHeldState); 72211aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff break; 72311aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff case WIFI_MODE_FULL_HIGH_PERF: 72411aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff transitionTo(mFullHighPerfLockHeldState); 72511aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff break; 72611aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff case WIFI_MODE_SCAN_ONLY: 72711aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff transitionTo(mScanOnlyLockHeldState); 72811aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff break; 72911aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff default: 73011aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff loge("Illegal lock " + mLocks.getStrongestLockMode()); 73111aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff } 73211aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff } else { 73311aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff if (mSettingsStore.isScanAlwaysAvailable()) { 73411aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff transitionTo(mScanOnlyLockHeldState); 73511aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff } else { 73611aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff transitionTo(mNoLockHeldState); 73711aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff } 73811aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff } 73911aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff } 74011aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff 74111aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff @Override 74211aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff public void dump(FileDescriptor fd, PrintWriter pw, String[] args) { 74311aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff super.dump(fd, pw, args); 74411aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff 74511aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff pw.println("mScreenOff " + mScreenOff); 74611aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff pw.println("mDeviceIdle " + mDeviceIdle); 74711aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff pw.println("mPluggedType " + mPluggedType); 74811aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff pw.println("mIdleMillis " + mIdleMillis); 74911aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff pw.println("mSleepPolicy " + mSleepPolicy); 75011aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff } 75111aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff} 752