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