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