ConnectivityManagerTestActivity.java revision 90e1c782a63475cd9b3973936decf6a4f6c6148f
1fc2dbd04005c32360eead803e29df3cc62209cd8Xia Wang/*
2fc2dbd04005c32360eead803e29df3cc62209cd8Xia Wang * Copyright (C) 2010, The Android Open Source Project
3fc2dbd04005c32360eead803e29df3cc62209cd8Xia Wang *
4fc2dbd04005c32360eead803e29df3cc62209cd8Xia Wang * Licensed under the Apache License, Version 2.0 (the "License");
5fc2dbd04005c32360eead803e29df3cc62209cd8Xia Wang * you may not use this file except in compliance with the License.
6fc2dbd04005c32360eead803e29df3cc62209cd8Xia Wang * You may obtain a copy of the License at
7fc2dbd04005c32360eead803e29df3cc62209cd8Xia Wang *
8fc2dbd04005c32360eead803e29df3cc62209cd8Xia Wang *      http://www.apache.org/licenses/LICENSE-2.0
9fc2dbd04005c32360eead803e29df3cc62209cd8Xia Wang *
10fc2dbd04005c32360eead803e29df3cc62209cd8Xia Wang * Unless required by applicable law or agreed to in writing, software
11fc2dbd04005c32360eead803e29df3cc62209cd8Xia Wang * distributed under the License is distributed on an "AS IS" BASIS,
12fc2dbd04005c32360eead803e29df3cc62209cd8Xia Wang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13fc2dbd04005c32360eead803e29df3cc62209cd8Xia Wang * See the License for the specific language governing permissions and
14fc2dbd04005c32360eead803e29df3cc62209cd8Xia Wang * limitations under the License.
15fc2dbd04005c32360eead803e29df3cc62209cd8Xia Wang */
16fc2dbd04005c32360eead803e29df3cc62209cd8Xia Wang
177fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wangpackage com.android.connectivitymanagertest;
187fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang
197fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wangimport android.app.Activity;
207fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wangimport android.content.Context;
217fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wangimport android.content.BroadcastReceiver;
227fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wangimport android.content.Intent;
237fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wangimport android.content.IntentFilter;
247fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wangimport android.os.Bundle;
257fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wangimport android.provider.Settings;
267fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wangimport android.util.Log;
27ba1348e3c21502ecde9427413703defa6d105132Yu Shan Emily Lauimport android.view.KeyEvent;
28ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang
29ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wangimport java.io.InputStream;
30ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wangimport java.util.ArrayList;
317fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wangimport java.util.List;
327fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wangimport android.widget.LinearLayout;
337fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wangimport android.net.ConnectivityManager;
347fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wangimport android.net.NetworkInfo;
357fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wangimport android.net.NetworkInfo.State;
367fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang
377fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wangimport android.net.wifi.WifiConfiguration;
387fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wangimport android.net.wifi.WifiManager;
392c15966f8cf6160ad5dcbbde372508de89985829Xia Wangimport android.net.wifi.WifiInfo;
407fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wangimport android.net.wifi.ScanResult;
417fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wangimport android.net.wifi.WifiConfiguration.KeyMgmt;
427fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang
437fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang/**
447fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang * An activity registered with connectivity manager broadcast
457fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang * provides network connectivity information and
467fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang * can be used to set device states: Cellular, Wifi, Airplane mode.
477fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang */
487fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wangpublic class ConnectivityManagerTestActivity extends Activity {
497fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang
507fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang    public static final String LOG_TAG = "ConnectivityManagerTestActivity";
51ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang    public static final int WAIT_FOR_SCAN_RESULT = 10 * 1000; //10 seconds
52a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang    public static final int WIFI_SCAN_TIMEOUT = 50 * 1000;
53ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang    public static final int SHORT_TIMEOUT = 5 * 1000;
54ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang    public static final long LONG_TIMEOUT = 50 * 1000;
556026d52710d7a6195a33885020d29aa1330fa855Xia Wang    public static final int SUCCESS = 0;  // for Wifi tethering state change
566026d52710d7a6195a33885020d29aa1330fa855Xia Wang    public static final int FAILURE = 1;
576026d52710d7a6195a33885020d29aa1330fa855Xia Wang    public static final int INIT = -1;
58ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang    private static final String ACCESS_POINT_FILE = "accesspoints.xml";
597fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang    public ConnectivityReceiver mConnectivityReceiver = null;
607fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang    public WifiReceiver mWifiReceiver = null;
61a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang    private AccessPointParserHelper mParseHelper = null;
627fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang    /*
637fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang     * Track network connectivity information
647fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang     */
657fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang    public State mState;
667fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang    public NetworkInfo mNetworkInfo;
677fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang    public NetworkInfo mOtherNetworkInfo;
687fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang    public boolean mIsFailOver;
697fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang    public String mReason;
707fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang    public boolean mScanResultIsAvailable = false;
717fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang    public ConnectivityManager mCM;
722c15966f8cf6160ad5dcbbde372508de89985829Xia Wang    public Object wifiObject = new Object();
732c15966f8cf6160ad5dcbbde372508de89985829Xia Wang    public Object connectivityObject = new Object();
742c15966f8cf6160ad5dcbbde372508de89985829Xia Wang    public int mWifiState;
752c15966f8cf6160ad5dcbbde372508de89985829Xia Wang    public NetworkInfo mWifiNetworkInfo;
762c15966f8cf6160ad5dcbbde372508de89985829Xia Wang    public String mBssid;
77ba1348e3c21502ecde9427413703defa6d105132Yu Shan Emily Lau    public String mPowerSsid = "GoogleGuest"; //Default power SSID
78ba1348e3c21502ecde9427413703defa6d105132Yu Shan Emily Lau    private Context mContext;
7990e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang    public boolean scanResultAvailable = false;
807fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang
817fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang    /*
827fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang     * Control Wifi States
837fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang     */
847fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang    public WifiManager mWifiManager;
857fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang
867fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang    /*
877fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang     * Verify connectivity state
887fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang     */
892c15966f8cf6160ad5dcbbde372508de89985829Xia Wang    public static final int NUM_NETWORK_TYPES = ConnectivityManager.MAX_NETWORK_TYPE + 1;
907fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang    NetworkState[] connectivityState = new NetworkState[NUM_NETWORK_TYPES];
917fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang
926026d52710d7a6195a33885020d29aa1330fa855Xia Wang    // For wifi tethering tests
936026d52710d7a6195a33885020d29aa1330fa855Xia Wang    private String[] mWifiRegexs;
946026d52710d7a6195a33885020d29aa1330fa855Xia Wang    public int mWifiTetherResult = INIT;    // -1 is initialization state
956026d52710d7a6195a33885020d29aa1330fa855Xia Wang
967fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang    /**
977fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang     * A wrapper of a broadcast receiver which provides network connectivity information
987fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang     * for all kinds of network: wifi, mobile, etc.
997fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang     */
1007fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang    private class ConnectivityReceiver extends BroadcastReceiver {
1017fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang        @Override
1027fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang        public void onReceive(Context context, Intent intent) {
103a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang            log("ConnectivityReceiver: onReceive() is called with " + intent);
1047fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang            String action = intent.getAction();
1057fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang            if (!action.equals(ConnectivityManager.CONNECTIVITY_ACTION)) {
1067fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang                Log.v("ConnectivityReceiver", "onReceive() called with " + intent);
1077fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang                return;
1087fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang            }
1097fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang
1107fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang            boolean noConnectivity =
1117fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang                intent.getBooleanExtra(ConnectivityManager.EXTRA_NO_CONNECTIVITY, false);
1127fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang
1137fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang            if (noConnectivity) {
1147fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang                mState = State.DISCONNECTED;
1157fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang            } else {
1167fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang                mState = State.CONNECTED;
1177fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang            }
1187fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang
1197fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang            mNetworkInfo = (NetworkInfo)
1207fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang                intent.getParcelableExtra(ConnectivityManager.EXTRA_NETWORK_INFO);
1217fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang
1227fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang            mOtherNetworkInfo = (NetworkInfo)
1237fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang                intent.getParcelableExtra(ConnectivityManager.EXTRA_OTHER_NETWORK_INFO);
1247fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang
1257fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang            mReason = intent.getStringExtra(ConnectivityManager.EXTRA_REASON);
1267fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang            mIsFailOver = intent.getBooleanExtra(ConnectivityManager.EXTRA_IS_FAILOVER, false);
1272c15966f8cf6160ad5dcbbde372508de89985829Xia Wang
128a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang            log("mNetworkInfo: " + mNetworkInfo.toString());
1292c15966f8cf6160ad5dcbbde372508de89985829Xia Wang            if (mOtherNetworkInfo != null) {
130a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang                log("mOtherNetworkInfo: " + mOtherNetworkInfo.toString());
1312c15966f8cf6160ad5dcbbde372508de89985829Xia Wang            }
1327fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang            recordNetworkState(mNetworkInfo.getType(), mNetworkInfo.getState());
1337fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang            if (mOtherNetworkInfo != null) {
1347fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang                recordNetworkState(mOtherNetworkInfo.getType(), mOtherNetworkInfo.getState());
1357fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang            }
1362c15966f8cf6160ad5dcbbde372508de89985829Xia Wang            notifyNetworkConnectivityChange();
1377fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang        }
1387fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang    }
1397fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang
1407fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang    private class WifiReceiver extends BroadcastReceiver {
1417fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang        @Override
1427fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang        public void onReceive(Context context, Intent intent) {
1437fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang            String action = intent.getAction();
1442c15966f8cf6160ad5dcbbde372508de89985829Xia Wang            Log.v("WifiReceiver", "onReceive() is calleld with " + intent);
1452c15966f8cf6160ad5dcbbde372508de89985829Xia Wang            if (action.equals(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)) {
14690e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang                log("scan results are available");
1472c15966f8cf6160ad5dcbbde372508de89985829Xia Wang                notifyScanResult();
1482c15966f8cf6160ad5dcbbde372508de89985829Xia Wang            } else if (action.equals(WifiManager.NETWORK_STATE_CHANGED_ACTION)) {
1492c15966f8cf6160ad5dcbbde372508de89985829Xia Wang                mWifiNetworkInfo =
1502c15966f8cf6160ad5dcbbde372508de89985829Xia Wang                    (NetworkInfo) intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO);
151a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang                log("mWifiNetworkInfo: " + mWifiNetworkInfo.toString());
1522c15966f8cf6160ad5dcbbde372508de89985829Xia Wang                if (mWifiNetworkInfo.getState() == State.CONNECTED) {
1532c15966f8cf6160ad5dcbbde372508de89985829Xia Wang                    mBssid = intent.getStringExtra(WifiManager.EXTRA_BSSID);
1542c15966f8cf6160ad5dcbbde372508de89985829Xia Wang                }
1552c15966f8cf6160ad5dcbbde372508de89985829Xia Wang                notifyWifiState();
1562c15966f8cf6160ad5dcbbde372508de89985829Xia Wang            } else if (action.equals(WifiManager.WIFI_STATE_CHANGED_ACTION)) {
1572c15966f8cf6160ad5dcbbde372508de89985829Xia Wang                mWifiState = intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE,
1582c15966f8cf6160ad5dcbbde372508de89985829Xia Wang                                                WifiManager.WIFI_STATE_UNKNOWN);
1592c15966f8cf6160ad5dcbbde372508de89985829Xia Wang                notifyWifiState();
1606026d52710d7a6195a33885020d29aa1330fa855Xia Wang            } else if (action.equals(WifiManager.WIFI_AP_STATE_CHANGED_ACTION)) {
1616026d52710d7a6195a33885020d29aa1330fa855Xia Wang                notifyWifiAPState();
1626026d52710d7a6195a33885020d29aa1330fa855Xia Wang            } else if (action.equals(ConnectivityManager.ACTION_TETHER_STATE_CHANGED)) {
1636026d52710d7a6195a33885020d29aa1330fa855Xia Wang                ArrayList<String> available = intent.getStringArrayListExtra(
1646026d52710d7a6195a33885020d29aa1330fa855Xia Wang                        ConnectivityManager.EXTRA_AVAILABLE_TETHER);
1656026d52710d7a6195a33885020d29aa1330fa855Xia Wang                ArrayList<String> active = intent.getStringArrayListExtra(
1666026d52710d7a6195a33885020d29aa1330fa855Xia Wang                        ConnectivityManager.EXTRA_ACTIVE_TETHER);
1676026d52710d7a6195a33885020d29aa1330fa855Xia Wang                ArrayList<String> errored = intent.getStringArrayListExtra(
1686026d52710d7a6195a33885020d29aa1330fa855Xia Wang                        ConnectivityManager.EXTRA_ERRORED_TETHER);
1696026d52710d7a6195a33885020d29aa1330fa855Xia Wang                updateTetherState(available.toArray(), active.toArray(), errored.toArray());
1702c15966f8cf6160ad5dcbbde372508de89985829Xia Wang            }
1712c15966f8cf6160ad5dcbbde372508de89985829Xia Wang            else {
1727fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang                return;
1737fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang            }
1747fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang        }
1757fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang    }
1767fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang
1777fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang    public ConnectivityManagerTestActivity() {
1787fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang        mState = State.UNKNOWN;
17990e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang        scanResultAvailable = false;
1807fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang    }
1817fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang
1827fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang    @Override
1837fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang    protected void onCreate(Bundle savedInstanceState) {
1847fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang        super.onCreate(savedInstanceState);
185a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang        log("onCreate, inst=" + Integer.toHexString(hashCode()));
1867fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang
1877fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang        // Create a simple layout
1887fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang        LinearLayout contentView = new LinearLayout(this);
1897fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang        contentView.setOrientation(LinearLayout.VERTICAL);
1907fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang        setContentView(contentView);
1917fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang        setTitle("ConnectivityManagerTestActivity");
1927fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang
1932c15966f8cf6160ad5dcbbde372508de89985829Xia Wang
1947fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang        // register a connectivity receiver for CONNECTIVITY_ACTION;
1952c15966f8cf6160ad5dcbbde372508de89985829Xia Wang        mConnectivityReceiver = new ConnectivityReceiver();
1967fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang        registerReceiver(mConnectivityReceiver,
1977fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang                new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION));
1987fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang
1997fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang        mWifiReceiver = new WifiReceiver();
2002c15966f8cf6160ad5dcbbde372508de89985829Xia Wang        IntentFilter mIntentFilter = new IntentFilter();
2012c15966f8cf6160ad5dcbbde372508de89985829Xia Wang        mIntentFilter.addAction(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION);
2022c15966f8cf6160ad5dcbbde372508de89985829Xia Wang        mIntentFilter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION);
2032c15966f8cf6160ad5dcbbde372508de89985829Xia Wang        mIntentFilter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION);
204ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang        mIntentFilter.addAction(WifiManager.SUPPLICANT_CONNECTION_CHANGE_ACTION);
2056026d52710d7a6195a33885020d29aa1330fa855Xia Wang        mIntentFilter.addAction(WifiManager.WIFI_AP_STATE_CHANGED_ACTION);
2066026d52710d7a6195a33885020d29aa1330fa855Xia Wang        mIntentFilter.addAction(ConnectivityManager.ACTION_TETHER_STATE_CHANGED);
2072c15966f8cf6160ad5dcbbde372508de89985829Xia Wang        registerReceiver(mWifiReceiver, mIntentFilter);
2082c15966f8cf6160ad5dcbbde372508de89985829Xia Wang
2097fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang        // Get an instance of ConnectivityManager
2107fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang        mCM = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
2117fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang        // Get an instance of WifiManager
2127fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang        mWifiManager =(WifiManager)getSystemService(Context.WIFI_SERVICE);
2137fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang        initializeNetworkStates();
2147fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang
2157fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang        if (mWifiManager.isWifiEnabled()) {
216a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang            log("Clear Wifi before we start the test.");
217ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang            removeConfiguredNetworksAndDisableWifi();
2187fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang        }
2196026d52710d7a6195a33885020d29aa1330fa855Xia Wang        mWifiRegexs = mCM.getTetherableWifiRegexs();
2207fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang     }
2217fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang
222ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang    public List<WifiConfiguration> loadNetworkConfigurations() throws Exception {
223ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang        InputStream in = getAssets().open(ACCESS_POINT_FILE);
224a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang        mParseHelper = new AccessPointParserHelper(in);
225a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang        return mParseHelper.getNetworkConfigurations();
226ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang    }
227ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang
2287fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang    // for each network type, initialize network states to UNKNOWN, and no verification flag is set
2297fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang    public void initializeNetworkStates() {
2307fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang        for (int networkType = NUM_NETWORK_TYPES - 1; networkType >=0; networkType--) {
2317fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang            connectivityState[networkType] =  new NetworkState();
232a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang            log("Initialize network state for " + networkType + ": " +
2337fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang                    connectivityState[networkType].toString());
2347fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang        }
2357fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang    }
2367fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang
2377fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang    // deposit a network state
2387fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang    public void recordNetworkState(int networkType, State networkState) {
239a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang        log("record network state for network " +  networkType +
2402c15966f8cf6160ad5dcbbde372508de89985829Xia Wang                ", state is " + networkState);
2417fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang        connectivityState[networkType].recordState(networkState);
2427fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang    }
2437fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang
2447fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang    // set the state transition criteria
2457fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang    public void setStateTransitionCriteria(int networkType, State initState,
2467fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang            int transitionDir, State targetState) {
2477fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang        connectivityState[networkType].setStateTransitionCriteria(
2487fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang                initState, transitionDir, targetState);
2497fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang    }
2507fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang
2517fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang    // Validate the states recorded
2527fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang    public boolean validateNetworkStates(int networkType) {
253a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang        log("validate network state for " + networkType + ": ");
2547fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang        return connectivityState[networkType].validateStateTransition();
2557fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang    }
2567fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang
2577fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang    // return result from network state validation
2587fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang    public String getTransitionFailureReason(int networkType) {
259a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang        log("get network state transition failure reason for " + networkType + ": " +
2607fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang                connectivityState[networkType].toString());
2617fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang        return connectivityState[networkType].getReason();
2627fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang    }
2637fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang
2642c15966f8cf6160ad5dcbbde372508de89985829Xia Wang    private void notifyNetworkConnectivityChange() {
2652c15966f8cf6160ad5dcbbde372508de89985829Xia Wang        synchronized(connectivityObject) {
266a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang            log("notify network connectivity changed");
2672c15966f8cf6160ad5dcbbde372508de89985829Xia Wang            connectivityObject.notifyAll();
2682c15966f8cf6160ad5dcbbde372508de89985829Xia Wang        }
2692c15966f8cf6160ad5dcbbde372508de89985829Xia Wang    }
2707fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang    private void notifyScanResult() {
2717fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang        synchronized (this) {
272a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang            log("notify that scan results are available");
27390e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang            scanResultAvailable = true;
2747fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang            this.notify();
2757fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang        }
2767fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang    }
2777fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang
2786026d52710d7a6195a33885020d29aa1330fa855Xia Wang    private void notifyWifiState() {
2792c15966f8cf6160ad5dcbbde372508de89985829Xia Wang        synchronized (wifiObject) {
280a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang            log("notify wifi state changed");
2812c15966f8cf6160ad5dcbbde372508de89985829Xia Wang            wifiObject.notify();
2822c15966f8cf6160ad5dcbbde372508de89985829Xia Wang        }
2832c15966f8cf6160ad5dcbbde372508de89985829Xia Wang    }
2842c15966f8cf6160ad5dcbbde372508de89985829Xia Wang
2856026d52710d7a6195a33885020d29aa1330fa855Xia Wang    private void notifyWifiAPState() {
2866026d52710d7a6195a33885020d29aa1330fa855Xia Wang        synchronized (this) {
287a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang            log("notify wifi AP state changed");
2886026d52710d7a6195a33885020d29aa1330fa855Xia Wang            this.notify();
2896026d52710d7a6195a33885020d29aa1330fa855Xia Wang        }
2906026d52710d7a6195a33885020d29aa1330fa855Xia Wang    }
2916026d52710d7a6195a33885020d29aa1330fa855Xia Wang
2926026d52710d7a6195a33885020d29aa1330fa855Xia Wang    // Update wifi tethering state
2936026d52710d7a6195a33885020d29aa1330fa855Xia Wang    private void updateTetherState(Object[] available, Object[] tethered, Object[] errored) {
2946026d52710d7a6195a33885020d29aa1330fa855Xia Wang        boolean wifiTethered = false;
2956026d52710d7a6195a33885020d29aa1330fa855Xia Wang        boolean wifiErrored = false;
2966026d52710d7a6195a33885020d29aa1330fa855Xia Wang
2976026d52710d7a6195a33885020d29aa1330fa855Xia Wang        synchronized (this) {
2986026d52710d7a6195a33885020d29aa1330fa855Xia Wang            for (Object obj: tethered) {
2996026d52710d7a6195a33885020d29aa1330fa855Xia Wang                String str = (String)obj;
3006026d52710d7a6195a33885020d29aa1330fa855Xia Wang                for (String tethRex: mWifiRegexs) {
301a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang                    log("str: " + str +"tethRex: " + tethRex);
3026026d52710d7a6195a33885020d29aa1330fa855Xia Wang                    if (str.matches(tethRex)) {
3036026d52710d7a6195a33885020d29aa1330fa855Xia Wang                        wifiTethered = true;
3046026d52710d7a6195a33885020d29aa1330fa855Xia Wang                    }
3056026d52710d7a6195a33885020d29aa1330fa855Xia Wang                }
3066026d52710d7a6195a33885020d29aa1330fa855Xia Wang            }
3076026d52710d7a6195a33885020d29aa1330fa855Xia Wang
3086026d52710d7a6195a33885020d29aa1330fa855Xia Wang            for (Object obj: errored) {
3096026d52710d7a6195a33885020d29aa1330fa855Xia Wang                String str = (String)obj;
3106026d52710d7a6195a33885020d29aa1330fa855Xia Wang                for (String tethRex: mWifiRegexs) {
311a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang                    log("error: str: " + str +"tethRex: " + tethRex);
3126026d52710d7a6195a33885020d29aa1330fa855Xia Wang                    if (str.matches(tethRex)) {
3136026d52710d7a6195a33885020d29aa1330fa855Xia Wang                        wifiErrored = true;
3146026d52710d7a6195a33885020d29aa1330fa855Xia Wang                    }
3156026d52710d7a6195a33885020d29aa1330fa855Xia Wang                }
3166026d52710d7a6195a33885020d29aa1330fa855Xia Wang            }
3176026d52710d7a6195a33885020d29aa1330fa855Xia Wang
3186026d52710d7a6195a33885020d29aa1330fa855Xia Wang            if (wifiTethered) {
3196026d52710d7a6195a33885020d29aa1330fa855Xia Wang                mWifiTetherResult = SUCCESS;   // wifi tethering is successful
3206026d52710d7a6195a33885020d29aa1330fa855Xia Wang            } else if (wifiErrored) {
3216026d52710d7a6195a33885020d29aa1330fa855Xia Wang                mWifiTetherResult = FAILURE;   // wifi tethering failed
3226026d52710d7a6195a33885020d29aa1330fa855Xia Wang            }
323a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang            log("mWifiTetherResult: " + mWifiTetherResult);
3246026d52710d7a6195a33885020d29aa1330fa855Xia Wang            this.notify();
3256026d52710d7a6195a33885020d29aa1330fa855Xia Wang        }
3266026d52710d7a6195a33885020d29aa1330fa855Xia Wang    }
3276026d52710d7a6195a33885020d29aa1330fa855Xia Wang
3286026d52710d7a6195a33885020d29aa1330fa855Xia Wang
329ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang    // Wait for network connectivity state: CONNECTING, CONNECTED, SUSPENDED,
330ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang    //                                      DISCONNECTING, DISCONNECTED, UNKNOWN
331ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang    public boolean waitForNetworkState(int networkType, State expectedState, long timeout) {
332ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang        long startTime = System.currentTimeMillis();
333ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang        while (true) {
334ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang            if ((System.currentTimeMillis() - startTime) > timeout) {
33590e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang                log("waitForNetworkState time out, the state of network type " + networkType +
33690e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang                        " is: " + mCM.getNetworkInfo(networkType).getState());
337ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang                if (mCM.getNetworkInfo(networkType).getState() != expectedState) {
338ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang                    return false;
339ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang                } else {
340ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang                    // the broadcast has been sent out. the state has been changed.
341a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang                    log("networktype: " + networkType + " state: " +
342ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang                            mCM.getNetworkInfo(networkType));
343ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang                    return true;
344ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang                }
345ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang            }
346a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang            log("Wait for the connectivity state for network: " + networkType +
347ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang                    " to be " + expectedState.toString());
348ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang            synchronized (connectivityObject) {
349ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang                try {
350ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang                    connectivityObject.wait(SHORT_TIMEOUT);
351ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang                } catch (InterruptedException e) {
352ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang                    e.printStackTrace();
353ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang                }
354ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang                if ((mNetworkInfo.getType() != networkType) ||
355ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang                    (mNetworkInfo.getState() != expectedState)) {
356a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang                    log("network state for " + mNetworkInfo.getType() +
357ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang                            "is: " + mNetworkInfo.getState());
358ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang                    continue;
359ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang                }
360ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang                return true;
361ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang            }
362ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang        }
363ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang    }
364ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang
365ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang    // Wait for Wifi state: WIFI_STATE_DISABLED, WIFI_STATE_DISABLING, WIFI_STATE_ENABLED,
366ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang    //                      WIFI_STATE_ENALBING, WIFI_STATE_UNKNOWN
367ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang    public boolean waitForWifiState(int expectedState, long timeout) {
368ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang        long startTime = System.currentTimeMillis();
369ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang        while (true) {
370ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang            if ((System.currentTimeMillis() - startTime) > timeout) {
371ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang                if (mWifiState != expectedState) {
372ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang                    return false;
373ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang                } else {
374ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang                    return true;
375ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang                }
376ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang            }
377a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang            log("Wait for wifi state to be: " + expectedState);
378ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang            synchronized (wifiObject) {
379ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang                try {
380ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang                    wifiObject.wait(SHORT_TIMEOUT);
381ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang                } catch (InterruptedException e) {
382ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang                    e.printStackTrace();
383ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang                }
384ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang                if (mWifiState != expectedState) {
385a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang                    log("Wifi state is: " + mWifiState);
386ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang                    continue;
387ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang                }
388ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang                return true;
389ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang            }
390ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang        }
391ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang    }
392ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang
3936026d52710d7a6195a33885020d29aa1330fa855Xia Wang    // Wait for Wifi AP state: WIFI_AP_STATE_DISABLED, WIFI_AP_STATE_DISABLING,
3946026d52710d7a6195a33885020d29aa1330fa855Xia Wang    //                         WIFI_AP_STATE_ENABLED, WIFI_STATE_ENALBING, WIFI_STATE_UNKNOWN
3956026d52710d7a6195a33885020d29aa1330fa855Xia Wang    public boolean waitForWifiAPState(int expectedState, long timeout) {
3966026d52710d7a6195a33885020d29aa1330fa855Xia Wang        long startTime = System.currentTimeMillis();
3976026d52710d7a6195a33885020d29aa1330fa855Xia Wang        while (true) {
3986026d52710d7a6195a33885020d29aa1330fa855Xia Wang            if ((System.currentTimeMillis() - startTime) > timeout) {
3996026d52710d7a6195a33885020d29aa1330fa855Xia Wang                if (mWifiManager.getWifiApState() != expectedState) {
4006026d52710d7a6195a33885020d29aa1330fa855Xia Wang                    return false;
4016026d52710d7a6195a33885020d29aa1330fa855Xia Wang                } else {
4026026d52710d7a6195a33885020d29aa1330fa855Xia Wang                    return true;
4036026d52710d7a6195a33885020d29aa1330fa855Xia Wang                }
4046026d52710d7a6195a33885020d29aa1330fa855Xia Wang            }
405a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang            log("Wait for wifi AP state to be: " + expectedState);
4066026d52710d7a6195a33885020d29aa1330fa855Xia Wang            synchronized (wifiObject) {
4076026d52710d7a6195a33885020d29aa1330fa855Xia Wang                try {
4086026d52710d7a6195a33885020d29aa1330fa855Xia Wang                    wifiObject.wait(SHORT_TIMEOUT);
4096026d52710d7a6195a33885020d29aa1330fa855Xia Wang                } catch (InterruptedException e) {
4106026d52710d7a6195a33885020d29aa1330fa855Xia Wang                    e.printStackTrace();
4116026d52710d7a6195a33885020d29aa1330fa855Xia Wang                }
4126026d52710d7a6195a33885020d29aa1330fa855Xia Wang                if (mWifiManager.getWifiApState() != expectedState) {
413a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang                    log("Wifi state is: " + mWifiManager.getWifiApState());
4146026d52710d7a6195a33885020d29aa1330fa855Xia Wang                    continue;
4156026d52710d7a6195a33885020d29aa1330fa855Xia Wang                }
4166026d52710d7a6195a33885020d29aa1330fa855Xia Wang                return true;
4176026d52710d7a6195a33885020d29aa1330fa855Xia Wang            }
4186026d52710d7a6195a33885020d29aa1330fa855Xia Wang        }
4196026d52710d7a6195a33885020d29aa1330fa855Xia Wang    }
4206026d52710d7a6195a33885020d29aa1330fa855Xia Wang
4216026d52710d7a6195a33885020d29aa1330fa855Xia Wang    /**
4226026d52710d7a6195a33885020d29aa1330fa855Xia Wang     * Wait for the wifi tethering result:
4236026d52710d7a6195a33885020d29aa1330fa855Xia Wang     * @param timeout is the maximum waiting time
4246026d52710d7a6195a33885020d29aa1330fa855Xia Wang     * @return SUCCESS if tethering result is successful
4256026d52710d7a6195a33885020d29aa1330fa855Xia Wang     *         FAILURE if tethering result returns error.
4266026d52710d7a6195a33885020d29aa1330fa855Xia Wang     */
4276026d52710d7a6195a33885020d29aa1330fa855Xia Wang    public int waitForTetherStateChange(long timeout) {
4286026d52710d7a6195a33885020d29aa1330fa855Xia Wang        long startTime = System.currentTimeMillis();
4296026d52710d7a6195a33885020d29aa1330fa855Xia Wang        while (true) {
4306026d52710d7a6195a33885020d29aa1330fa855Xia Wang            if ((System.currentTimeMillis() - startTime) > timeout) {
4316026d52710d7a6195a33885020d29aa1330fa855Xia Wang                return mWifiTetherResult;
4326026d52710d7a6195a33885020d29aa1330fa855Xia Wang            }
433a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang            log("Wait for wifi tethering result.");
4346026d52710d7a6195a33885020d29aa1330fa855Xia Wang            synchronized (this) {
4356026d52710d7a6195a33885020d29aa1330fa855Xia Wang                try {
4366026d52710d7a6195a33885020d29aa1330fa855Xia Wang                    this.wait(SHORT_TIMEOUT);
4376026d52710d7a6195a33885020d29aa1330fa855Xia Wang                } catch (InterruptedException e) {
4386026d52710d7a6195a33885020d29aa1330fa855Xia Wang                    e.printStackTrace();
4396026d52710d7a6195a33885020d29aa1330fa855Xia Wang                }
4406026d52710d7a6195a33885020d29aa1330fa855Xia Wang                if (mWifiTetherResult == INIT ) {
4416026d52710d7a6195a33885020d29aa1330fa855Xia Wang                    continue;
4426026d52710d7a6195a33885020d29aa1330fa855Xia Wang                } else {
4436026d52710d7a6195a33885020d29aa1330fa855Xia Wang                    return mWifiTetherResult;
4446026d52710d7a6195a33885020d29aa1330fa855Xia Wang                }
4456026d52710d7a6195a33885020d29aa1330fa855Xia Wang            }
4466026d52710d7a6195a33885020d29aa1330fa855Xia Wang        }
4476026d52710d7a6195a33885020d29aa1330fa855Xia Wang    }
4486026d52710d7a6195a33885020d29aa1330fa855Xia Wang
4497fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang    // Return true if device is currently connected to mobile network
4507fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang    public boolean isConnectedToMobile() {
4517fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang        return (mNetworkInfo.getType() == ConnectivityManager.TYPE_MOBILE);
4527fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang    }
4537fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang
4547fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang    // Return true if device is currently connected to Wifi
4557fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang    public boolean isConnectedToWifi() {
4567fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang        return (mNetworkInfo.getType() == ConnectivityManager.TYPE_WIFI);
4577fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang    }
4587fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang
4597fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang    public boolean enableWifi() {
4607fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang        return mWifiManager.setWifiEnabled(true);
4617fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang    }
4627fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang
4637fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang    /**
4647fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang     * Associate the device to given SSID
4657fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang     * If the device is already associated with a WiFi, disconnect and forget it,
4667fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang     * We don't verify whether the connection is successful or not, leave this to the test
4677fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang     */
4687fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang    public boolean connectToWifi(String knownSSID) {
469ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang        WifiConfiguration config = new WifiConfiguration();
470ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang        config.SSID = knownSSID;
471ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang        config.allowedKeyManagement.set(KeyMgmt.NONE);
472ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang        return connectToWifiWithConfiguration(config);
473ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang    }
474ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang
475ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang    /**
476ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang     * Connect to Wi-Fi with the given configuration. Note the SSID in the configuration
477ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang     * is pure string, we need to convert it to quoted string.
478ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang     * @param config
479ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang     * @return
480ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang     */
481ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang    public boolean connectToWifiWithConfiguration(WifiConfiguration config) {
482ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang        String ssid = config.SSID;
483ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang        config.SSID = convertToQuotedString(ssid);
484ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang
4857fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang        //If Wifi is not enabled, enable it
4867fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang        if (!mWifiManager.isWifiEnabled()) {
487a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang            log("Wifi is not enabled, enable it");
4887fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang            mWifiManager.setWifiEnabled(true);
489a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang            // wait for the wifi state change before start scanning.
490a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang            if (!waitForWifiState(WifiManager.WIFI_STATE_ENABLED, 2*SHORT_TIMEOUT)) {
491a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang                log("wait for WIFI_STATE_ENABLED failed");
492a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang                return false;
493a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang            }
4947fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang        }
4957fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang
496a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang        boolean foundApInScanResults = false;
497a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang        for (int retry = 0; retry < 5; retry++) {
498a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang            List<ScanResult> netList = mWifiManager.getScanResults();
499a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang            if (netList != null) {
500a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang                log("size of scan result list: " + netList.size());
501a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang                for (int i = 0; i < netList.size(); i++) {
502a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang                    ScanResult sr= netList.get(i);
503a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang                    if (sr.SSID.equals(ssid)) {
504a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang                        log("found " + ssid + " in the scan result list");
505a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang                        log("retry: " + retry);
506a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang                        foundApInScanResults = true;
507a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang                        mWifiManager.connectNetwork(config);
508a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang                        break;
509a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang                   }
5107fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang                }
511a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang            }
512a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang            if (foundApInScanResults) {
513a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang                return true;
514a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang            } else {
515a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang                // Start an active scan
516a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang                mWifiManager.startScanActive();
517a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang                mScanResultIsAvailable = false;
518a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang                long startTime = System.currentTimeMillis();
519a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang                while (!mScanResultIsAvailable) {
520a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang                    if ((System.currentTimeMillis() - startTime) > WIFI_SCAN_TIMEOUT) {
521a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang                        log("wait for scan results timeout");
522a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang                        return false;
5237fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang                    }
524a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang                    // wait for the scan results to be available
525a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang                    synchronized (this) {
526a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang                        // wait for the scan result to be available
527a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang                        try {
528a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang                            this.wait(WAIT_FOR_SCAN_RESULT);
529a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang                        } catch (InterruptedException e) {
530a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang                            e.printStackTrace();
531a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang                        }
532a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang                        if ((mWifiManager.getScanResults() == null) ||
533a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang                                (mWifiManager.getScanResults().size() <= 0)) {
534a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang                            continue;
535a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang                        }
536a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang                        mScanResultIsAvailable = true;
5377fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang                    }
5387fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang                }
5397fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang            }
5407fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang        }
541a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang        return false;
5427fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang    }
5437fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang
5442c15966f8cf6160ad5dcbbde372508de89985829Xia Wang    /*
545ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang     * Disconnect from the current AP and remove configured networks.
5467fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang     */
5472c15966f8cf6160ad5dcbbde372508de89985829Xia Wang    public boolean disconnectAP() {
5482c15966f8cf6160ad5dcbbde372508de89985829Xia Wang        if (mWifiManager.isWifiEnabled()) {
549a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang            // remove saved networks
550a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang            List<WifiConfiguration> wifiConfigList = mWifiManager.getConfiguredNetworks();
551a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang            for (WifiConfiguration wifiConfig: wifiConfigList) {
552a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang                log("remove wifi configuration: " + wifiConfig.toString());
553a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang                mWifiManager.forgetNetwork(wifiConfig.networkId);
5547fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang            }
5552c15966f8cf6160ad5dcbbde372508de89985829Xia Wang        }
5562c15966f8cf6160ad5dcbbde372508de89985829Xia Wang        return true;
5572c15966f8cf6160ad5dcbbde372508de89985829Xia Wang    }
5582c15966f8cf6160ad5dcbbde372508de89985829Xia Wang    /**
5592c15966f8cf6160ad5dcbbde372508de89985829Xia Wang     * Disable Wifi
5602c15966f8cf6160ad5dcbbde372508de89985829Xia Wang     * @return true if Wifi is disabled successfully
5612c15966f8cf6160ad5dcbbde372508de89985829Xia Wang     */
5622c15966f8cf6160ad5dcbbde372508de89985829Xia Wang    public boolean disableWifi() {
5632c15966f8cf6160ad5dcbbde372508de89985829Xia Wang        return mWifiManager.setWifiEnabled(false);
5642c15966f8cf6160ad5dcbbde372508de89985829Xia Wang    }
5652c15966f8cf6160ad5dcbbde372508de89985829Xia Wang
5662c15966f8cf6160ad5dcbbde372508de89985829Xia Wang    /**
567ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang     * Remove configured networks and disable wifi
5682c15966f8cf6160ad5dcbbde372508de89985829Xia Wang     */
569ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang    public boolean removeConfiguredNetworksAndDisableWifi() {
5702c15966f8cf6160ad5dcbbde372508de89985829Xia Wang            if (!disconnectAP()) {
5712c15966f8cf6160ad5dcbbde372508de89985829Xia Wang                return false;
5722c15966f8cf6160ad5dcbbde372508de89985829Xia Wang            }
5732c15966f8cf6160ad5dcbbde372508de89985829Xia Wang            // Disable Wifi
5747fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang            if (!mWifiManager.setWifiEnabled(false)) {
5757fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang                return false;
5767fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang            }
5772c15966f8cf6160ad5dcbbde372508de89985829Xia Wang            // Wait for the actions to be completed
5787fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang            try {
579a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang                Thread.sleep(SHORT_TIMEOUT);
5807fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang            } catch (InterruptedException e) {}
5817fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang        return true;
5827fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang    }
5837fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang
5847fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang    /**
5857fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang     * Set airplane mode
5867fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang     */
5877fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang    public void setAirplaneMode(Context context, boolean enableAM) {
5887fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang        //set the airplane mode
5897fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang        Settings.System.putInt(context.getContentResolver(), Settings.System.AIRPLANE_MODE_ON,
5907fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang                enableAM ? 1 : 0);
5917fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang        // Post the intent
5927fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang        Intent intent = new Intent(Intent.ACTION_AIRPLANE_MODE_CHANGED);
5937fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang        intent.putExtra("state", enableAM);
5947fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang        context.sendBroadcast(intent);
5957fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang    }
5967fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang
597069067963cf0117cfb4a1aef99b550b126d9ca92Xia Wang    protected static String convertToQuotedString(String string) {
598069067963cf0117cfb4a1aef99b550b126d9ca92Xia Wang        return "\"" + string + "\"";
599069067963cf0117cfb4a1aef99b550b126d9ca92Xia Wang    }
600069067963cf0117cfb4a1aef99b550b126d9ca92Xia Wang
6017fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang    @Override
6027fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang    protected void onDestroy() {
6037fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang        super.onDestroy();
6047fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang
6057fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang        //Unregister receiver
6067fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang        if (mConnectivityReceiver != null) {
6077fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang            unregisterReceiver(mConnectivityReceiver);
6087fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang        }
6097fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang        if (mWifiReceiver != null) {
6107fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang            unregisterReceiver(mWifiReceiver);
6117fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang        }
612a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang        log("onDestroy, inst=" + Integer.toHexString(hashCode()));
6137fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang    }
614ba1348e3c21502ecde9427413703defa6d105132Yu Shan Emily Lau
615ba1348e3c21502ecde9427413703defa6d105132Yu Shan Emily Lau    @Override
616ba1348e3c21502ecde9427413703defa6d105132Yu Shan Emily Lau    public void onStart() {
617ba1348e3c21502ecde9427413703defa6d105132Yu Shan Emily Lau        super.onStart();
618ba1348e3c21502ecde9427413703defa6d105132Yu Shan Emily Lau        mContext = this;
619ba1348e3c21502ecde9427413703defa6d105132Yu Shan Emily Lau        Bundle bundle = this.getIntent().getExtras();
620ba1348e3c21502ecde9427413703defa6d105132Yu Shan Emily Lau        if (bundle != null){
621ba1348e3c21502ecde9427413703defa6d105132Yu Shan Emily Lau            mPowerSsid = bundle.getString("power_ssid");
622ba1348e3c21502ecde9427413703defa6d105132Yu Shan Emily Lau        }
623ba1348e3c21502ecde9427413703defa6d105132Yu Shan Emily Lau    }
624ba1348e3c21502ecde9427413703defa6d105132Yu Shan Emily Lau    //A thread to set the device into airplane mode then turn on wifi.
625ba1348e3c21502ecde9427413703defa6d105132Yu Shan Emily Lau    Thread setDeviceWifiAndAirplaneThread = new Thread(new Runnable() {
626ba1348e3c21502ecde9427413703defa6d105132Yu Shan Emily Lau        public void run() {
627ba1348e3c21502ecde9427413703defa6d105132Yu Shan Emily Lau            setAirplaneMode(mContext, true);
628ba1348e3c21502ecde9427413703defa6d105132Yu Shan Emily Lau            connectToWifi(mPowerSsid);
629ba1348e3c21502ecde9427413703defa6d105132Yu Shan Emily Lau        }
630ba1348e3c21502ecde9427413703defa6d105132Yu Shan Emily Lau    });
631ba1348e3c21502ecde9427413703defa6d105132Yu Shan Emily Lau
632ba1348e3c21502ecde9427413703defa6d105132Yu Shan Emily Lau    //A thread to set the device into wifi
633ba1348e3c21502ecde9427413703defa6d105132Yu Shan Emily Lau    Thread setDeviceInWifiOnlyThread = new Thread(new Runnable() {
634ba1348e3c21502ecde9427413703defa6d105132Yu Shan Emily Lau        public void run() {
635ba1348e3c21502ecde9427413703defa6d105132Yu Shan Emily Lau            connectToWifi(mPowerSsid);
636ba1348e3c21502ecde9427413703defa6d105132Yu Shan Emily Lau        }
637ba1348e3c21502ecde9427413703defa6d105132Yu Shan Emily Lau    });
638ba1348e3c21502ecde9427413703defa6d105132Yu Shan Emily Lau
639ba1348e3c21502ecde9427413703defa6d105132Yu Shan Emily Lau    @Override
640ba1348e3c21502ecde9427413703defa6d105132Yu Shan Emily Lau    public boolean onKeyDown(int keyCode, KeyEvent event) {
641ba1348e3c21502ecde9427413703defa6d105132Yu Shan Emily Lau        switch (keyCode) {
642ba1348e3c21502ecde9427413703defa6d105132Yu Shan Emily Lau            //This is a tricky way for the scripted monkey to
643ba1348e3c21502ecde9427413703defa6d105132Yu Shan Emily Lau            //set the device in wifi and wifi in airplane mode.
644ba1348e3c21502ecde9427413703defa6d105132Yu Shan Emily Lau            case KeyEvent.KEYCODE_1:
645ba1348e3c21502ecde9427413703defa6d105132Yu Shan Emily Lau                setDeviceWifiAndAirplaneThread.start();
646ba1348e3c21502ecde9427413703defa6d105132Yu Shan Emily Lau                break;
647ba1348e3c21502ecde9427413703defa6d105132Yu Shan Emily Lau
648ba1348e3c21502ecde9427413703defa6d105132Yu Shan Emily Lau            case KeyEvent.KEYCODE_2:
649ba1348e3c21502ecde9427413703defa6d105132Yu Shan Emily Lau                setDeviceInWifiOnlyThread.start();
650ba1348e3c21502ecde9427413703defa6d105132Yu Shan Emily Lau                break;
651ba1348e3c21502ecde9427413703defa6d105132Yu Shan Emily Lau        }
652ba1348e3c21502ecde9427413703defa6d105132Yu Shan Emily Lau        return super.onKeyDown(keyCode, event);
653ba1348e3c21502ecde9427413703defa6d105132Yu Shan Emily Lau    }
654a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang
655a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang    private void log(String message) {
656a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang        Log.v(LOG_TAG, message);
657a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang    }
6587fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang}
659