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; 24ebe606fccd9293674273d5f73246e0e8e6e6ddcfIrfan Sheriffimport android.net.ConnectivityManager; 25ebe606fccd9293674273d5f73246e0e8e6e6ddcfIrfan Sheriffimport android.net.NetworkInfo; 26ebe606fccd9293674273d5f73246e0e8e6e6ddcfIrfan Sheriffimport android.net.NetworkInfo.State; 27ebe606fccd9293674273d5f73246e0e8e6e6ddcfIrfan Sheriffimport android.net.wifi.WifiConfiguration; 28ebe606fccd9293674273d5f73246e0e8e6e6ddcfIrfan Sheriffimport android.net.wifi.WifiManager; 29ebe606fccd9293674273d5f73246e0e8e6e6ddcfIrfan Sheriffimport android.net.wifi.WifiInfo; 30ebe606fccd9293674273d5f73246e0e8e6e6ddcfIrfan Sheriffimport android.net.wifi.ScanResult; 31ebe606fccd9293674273d5f73246e0e8e6e6ddcfIrfan Sheriffimport android.net.wifi.WifiConfiguration.KeyMgmt; 327fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wangimport android.os.Bundle; 33ebe606fccd9293674273d5f73246e0e8e6e6ddcfIrfan Sheriffimport android.os.Handler; 3473055f12d7764e322f3f83717525a2dba01f9ef9Xia Wangimport android.os.IPowerManager; 35ebe606fccd9293674273d5f73246e0e8e6e6ddcfIrfan Sheriffimport android.os.Message; 3673055f12d7764e322f3f83717525a2dba01f9ef9Xia Wangimport android.os.PowerManager; 3773055f12d7764e322f3f83717525a2dba01f9ef9Xia Wangimport android.os.ServiceManager; 3873055f12d7764e322f3f83717525a2dba01f9ef9Xia Wangimport android.os.SystemClock; 39c09cdce1b05075da808ae080b9905a14a3e1e627Christopher Tateimport android.os.UserHandle; 407fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wangimport android.provider.Settings; 417fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wangimport android.util.Log; 42ba1348e3c21502ecde9427413703defa6d105132Yu Shan Emily Lauimport android.view.KeyEvent; 43ebe606fccd9293674273d5f73246e0e8e6e6ddcfIrfan Sheriffimport android.widget.LinearLayout; 44ebe606fccd9293674273d5f73246e0e8e6e6ddcfIrfan Sheriff 45ebe606fccd9293674273d5f73246e0e8e6e6ddcfIrfan Sheriffimport com.android.internal.util.AsyncChannel; 46ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang 476bffe14c78efa0b56327262543ce2e0dfc024219Xia Wangimport java.io.IOException; 48ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wangimport java.io.InputStream; 496bffe14c78efa0b56327262543ce2e0dfc024219Xia Wangimport java.net.UnknownHostException; 50ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wangimport java.util.ArrayList; 517fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wangimport java.util.List; 527fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang 537fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang 547fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang/** 557fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang * An activity registered with connectivity manager broadcast 567fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang * provides network connectivity information and 577fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang * can be used to set device states: Cellular, Wifi, Airplane mode. 587fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang */ 597fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wangpublic class ConnectivityManagerTestActivity extends Activity { 607fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang 617fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang public static final String LOG_TAG = "ConnectivityManagerTestActivity"; 62ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang public static final int WAIT_FOR_SCAN_RESULT = 10 * 1000; //10 seconds 63f2991add02f3e6f50dd65a835fffec3aa7221769Xia Wang public static final int WIFI_SCAN_TIMEOUT = 50 * 1000; // 50 seconds 64f2991add02f3e6f50dd65a835fffec3aa7221769Xia Wang public static final int SHORT_TIMEOUT = 5 * 1000; // 5 seconds 65f2991add02f3e6f50dd65a835fffec3aa7221769Xia Wang public static final long LONG_TIMEOUT = 50 * 1000; // 50 seconds 66f2991add02f3e6f50dd65a835fffec3aa7221769Xia Wang public static final long WIFI_CONNECTION_TIMEOUT = 5 * 60 * 1000; // 5 minutes 67a4c2caac05009512213454d329579a79dde11e5fXia Wang // 2 minutes timer between wifi stop and start 68f2991add02f3e6f50dd65a835fffec3aa7221769Xia Wang public static final long WIFI_STOP_START_INTERVAL = 2 * 60 * 1000; // 2 minutes 69b2a2096903342a9eaba0b8f64f0f549e5277b662Xia Wang // Set ping test timer to be 3 minutes 70f2991add02f3e6f50dd65a835fffec3aa7221769Xia Wang public static final long PING_TIMER = 3 * 60 *1000; // 3 minutes 716026d52710d7a6195a33885020d29aa1330fa855Xia Wang public static final int SUCCESS = 0; // for Wifi tethering state change 726026d52710d7a6195a33885020d29aa1330fa855Xia Wang public static final int FAILURE = 1; 736026d52710d7a6195a33885020d29aa1330fa855Xia Wang public static final int INIT = -1; 74ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang private static final String ACCESS_POINT_FILE = "accesspoints.xml"; 757fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang public ConnectivityReceiver mConnectivityReceiver = null; 767fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang public WifiReceiver mWifiReceiver = null; 77a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang private AccessPointParserHelper mParseHelper = null; 787fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang /* 797fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang * Track network connectivity information 807fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang */ 817fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang public State mState; 827fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang public NetworkInfo mNetworkInfo; 837fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang public NetworkInfo mOtherNetworkInfo; 847fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang public boolean mIsFailOver; 857fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang public String mReason; 867fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang public boolean mScanResultIsAvailable = false; 877fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang public ConnectivityManager mCM; 882c15966f8cf6160ad5dcbbde372508de89985829Xia Wang public Object wifiObject = new Object(); 892c15966f8cf6160ad5dcbbde372508de89985829Xia Wang public Object connectivityObject = new Object(); 902c15966f8cf6160ad5dcbbde372508de89985829Xia Wang public int mWifiState; 912c15966f8cf6160ad5dcbbde372508de89985829Xia Wang public NetworkInfo mWifiNetworkInfo; 922c15966f8cf6160ad5dcbbde372508de89985829Xia Wang public String mBssid; 933d273da8fa08ddcb16b8fefa35aff10b45778ddcYu Shan Emily Lau public String mPowerSsid = "opennet"; //Default power SSID 94ba1348e3c21502ecde9427413703defa6d105132Yu Shan Emily Lau private Context mContext; 9590e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang public boolean scanResultAvailable = false; 967fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang 977fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang /* 987fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang * Control Wifi States 997fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang */ 1007fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang public WifiManager mWifiManager; 1017fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang 1027fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang /* 1037fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang * Verify connectivity state 1047fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang */ 1052c15966f8cf6160ad5dcbbde372508de89985829Xia Wang public static final int NUM_NETWORK_TYPES = ConnectivityManager.MAX_NETWORK_TYPE + 1; 1067fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang NetworkState[] connectivityState = new NetworkState[NUM_NETWORK_TYPES]; 1077fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang 1086026d52710d7a6195a33885020d29aa1330fa855Xia Wang // For wifi tethering tests 1096026d52710d7a6195a33885020d29aa1330fa855Xia Wang private String[] mWifiRegexs; 1106026d52710d7a6195a33885020d29aa1330fa855Xia Wang public int mWifiTetherResult = INIT; // -1 is initialization state 1116026d52710d7a6195a33885020d29aa1330fa855Xia Wang 1127fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang /** 1137fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang * A wrapper of a broadcast receiver which provides network connectivity information 1147fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang * for all kinds of network: wifi, mobile, etc. 1157fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang */ 1167fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang private class ConnectivityReceiver extends BroadcastReceiver { 1177fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang @Override 1187fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang public void onReceive(Context context, Intent intent) { 119a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang log("ConnectivityReceiver: onReceive() is called with " + intent); 1207fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang String action = intent.getAction(); 1217fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang if (!action.equals(ConnectivityManager.CONNECTIVITY_ACTION)) { 1227fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang Log.v("ConnectivityReceiver", "onReceive() called with " + intent); 1237fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang return; 1247fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang } 1257fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang 1267fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang boolean noConnectivity = 1277fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang intent.getBooleanExtra(ConnectivityManager.EXTRA_NO_CONNECTIVITY, false); 1287fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang 1297fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang if (noConnectivity) { 1307fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang mState = State.DISCONNECTED; 1317fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang } else { 1327fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang mState = State.CONNECTED; 1337fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang } 1347fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang 1357fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang mNetworkInfo = (NetworkInfo) 1367fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang intent.getParcelableExtra(ConnectivityManager.EXTRA_NETWORK_INFO); 1377fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang 1387fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang mOtherNetworkInfo = (NetworkInfo) 1397fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang intent.getParcelableExtra(ConnectivityManager.EXTRA_OTHER_NETWORK_INFO); 1407fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang 1417fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang mReason = intent.getStringExtra(ConnectivityManager.EXTRA_REASON); 1427fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang mIsFailOver = intent.getBooleanExtra(ConnectivityManager.EXTRA_IS_FAILOVER, false); 1432c15966f8cf6160ad5dcbbde372508de89985829Xia Wang 144a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang log("mNetworkInfo: " + mNetworkInfo.toString()); 1452c15966f8cf6160ad5dcbbde372508de89985829Xia Wang if (mOtherNetworkInfo != null) { 146a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang log("mOtherNetworkInfo: " + mOtherNetworkInfo.toString()); 1472c15966f8cf6160ad5dcbbde372508de89985829Xia Wang } 1487fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang recordNetworkState(mNetworkInfo.getType(), mNetworkInfo.getState()); 1497fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang if (mOtherNetworkInfo != null) { 1507fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang recordNetworkState(mOtherNetworkInfo.getType(), mOtherNetworkInfo.getState()); 1517fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang } 1522c15966f8cf6160ad5dcbbde372508de89985829Xia Wang notifyNetworkConnectivityChange(); 1537fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang } 1547fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang } 1557fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang 1567fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang private class WifiReceiver extends BroadcastReceiver { 1577fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang @Override 1587fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang public void onReceive(Context context, Intent intent) { 1597fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang String action = intent.getAction(); 1602c15966f8cf6160ad5dcbbde372508de89985829Xia Wang Log.v("WifiReceiver", "onReceive() is calleld with " + intent); 1612c15966f8cf6160ad5dcbbde372508de89985829Xia Wang if (action.equals(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)) { 16290e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang log("scan results are available"); 1632c15966f8cf6160ad5dcbbde372508de89985829Xia Wang notifyScanResult(); 1642c15966f8cf6160ad5dcbbde372508de89985829Xia Wang } else if (action.equals(WifiManager.NETWORK_STATE_CHANGED_ACTION)) { 1652c15966f8cf6160ad5dcbbde372508de89985829Xia Wang mWifiNetworkInfo = 1662c15966f8cf6160ad5dcbbde372508de89985829Xia Wang (NetworkInfo) intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO); 167a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang log("mWifiNetworkInfo: " + mWifiNetworkInfo.toString()); 1682c15966f8cf6160ad5dcbbde372508de89985829Xia Wang if (mWifiNetworkInfo.getState() == State.CONNECTED) { 1692c15966f8cf6160ad5dcbbde372508de89985829Xia Wang mBssid = intent.getStringExtra(WifiManager.EXTRA_BSSID); 1702c15966f8cf6160ad5dcbbde372508de89985829Xia Wang } 1712c15966f8cf6160ad5dcbbde372508de89985829Xia Wang notifyWifiState(); 1722c15966f8cf6160ad5dcbbde372508de89985829Xia Wang } else if (action.equals(WifiManager.WIFI_STATE_CHANGED_ACTION)) { 1732c15966f8cf6160ad5dcbbde372508de89985829Xia Wang mWifiState = intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE, 1742c15966f8cf6160ad5dcbbde372508de89985829Xia Wang WifiManager.WIFI_STATE_UNKNOWN); 1752c15966f8cf6160ad5dcbbde372508de89985829Xia Wang notifyWifiState(); 1766026d52710d7a6195a33885020d29aa1330fa855Xia Wang } else if (action.equals(WifiManager.WIFI_AP_STATE_CHANGED_ACTION)) { 1776026d52710d7a6195a33885020d29aa1330fa855Xia Wang notifyWifiAPState(); 1786026d52710d7a6195a33885020d29aa1330fa855Xia Wang } else if (action.equals(ConnectivityManager.ACTION_TETHER_STATE_CHANGED)) { 1796026d52710d7a6195a33885020d29aa1330fa855Xia Wang ArrayList<String> available = intent.getStringArrayListExtra( 1806026d52710d7a6195a33885020d29aa1330fa855Xia Wang ConnectivityManager.EXTRA_AVAILABLE_TETHER); 1816026d52710d7a6195a33885020d29aa1330fa855Xia Wang ArrayList<String> active = intent.getStringArrayListExtra( 1826026d52710d7a6195a33885020d29aa1330fa855Xia Wang ConnectivityManager.EXTRA_ACTIVE_TETHER); 1836026d52710d7a6195a33885020d29aa1330fa855Xia Wang ArrayList<String> errored = intent.getStringArrayListExtra( 1846026d52710d7a6195a33885020d29aa1330fa855Xia Wang ConnectivityManager.EXTRA_ERRORED_TETHER); 1856026d52710d7a6195a33885020d29aa1330fa855Xia Wang updateTetherState(available.toArray(), active.toArray(), errored.toArray()); 1862c15966f8cf6160ad5dcbbde372508de89985829Xia Wang } 1872c15966f8cf6160ad5dcbbde372508de89985829Xia Wang else { 1887fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang return; 1897fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang } 1907fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang } 1917fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang } 1927fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang 193ebe606fccd9293674273d5f73246e0e8e6e6ddcfIrfan Sheriff private class WifiServiceHandler extends Handler { 194ebe606fccd9293674273d5f73246e0e8e6e6ddcfIrfan Sheriff @Override 195ebe606fccd9293674273d5f73246e0e8e6e6ddcfIrfan Sheriff public void handleMessage(Message msg) { 196ebe606fccd9293674273d5f73246e0e8e6e6ddcfIrfan Sheriff switch (msg.what) { 197ebe606fccd9293674273d5f73246e0e8e6e6ddcfIrfan Sheriff case AsyncChannel.CMD_CHANNEL_HALF_CONNECTED: 198ebe606fccd9293674273d5f73246e0e8e6e6ddcfIrfan Sheriff if (msg.arg1 == AsyncChannel.STATUS_SUCCESSFUL) { 199ebe606fccd9293674273d5f73246e0e8e6e6ddcfIrfan Sheriff //AsyncChannel in msg.obj 200ebe606fccd9293674273d5f73246e0e8e6e6ddcfIrfan Sheriff } else { 201ebe606fccd9293674273d5f73246e0e8e6e6ddcfIrfan Sheriff log("Failed to establish AsyncChannel connection"); 202ebe606fccd9293674273d5f73246e0e8e6e6ddcfIrfan Sheriff } 203ebe606fccd9293674273d5f73246e0e8e6e6ddcfIrfan Sheriff break; 204ebe606fccd9293674273d5f73246e0e8e6e6ddcfIrfan Sheriff default: 205ebe606fccd9293674273d5f73246e0e8e6e6ddcfIrfan Sheriff //Ignore 206ebe606fccd9293674273d5f73246e0e8e6e6ddcfIrfan Sheriff break; 207ebe606fccd9293674273d5f73246e0e8e6e6ddcfIrfan Sheriff } 208ebe606fccd9293674273d5f73246e0e8e6e6ddcfIrfan Sheriff } 209ebe606fccd9293674273d5f73246e0e8e6e6ddcfIrfan Sheriff } 210ebe606fccd9293674273d5f73246e0e8e6e6ddcfIrfan Sheriff 2117fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang public ConnectivityManagerTestActivity() { 2127fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang mState = State.UNKNOWN; 21390e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang scanResultAvailable = false; 2147fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang } 2157fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang 2167fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang @Override 2177fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang protected void onCreate(Bundle savedInstanceState) { 2187fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang super.onCreate(savedInstanceState); 219a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang log("onCreate, inst=" + Integer.toHexString(hashCode())); 2207fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang 2217fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang // Create a simple layout 2227fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang LinearLayout contentView = new LinearLayout(this); 2237fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang contentView.setOrientation(LinearLayout.VERTICAL); 2247fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang setContentView(contentView); 2257fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang setTitle("ConnectivityManagerTestActivity"); 2267fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang 2272c15966f8cf6160ad5dcbbde372508de89985829Xia Wang 2287fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang // register a connectivity receiver for CONNECTIVITY_ACTION; 2292c15966f8cf6160ad5dcbbde372508de89985829Xia Wang mConnectivityReceiver = new ConnectivityReceiver(); 2307fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang registerReceiver(mConnectivityReceiver, 2317fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION)); 2327fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang 2337fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang mWifiReceiver = new WifiReceiver(); 2342c15966f8cf6160ad5dcbbde372508de89985829Xia Wang IntentFilter mIntentFilter = new IntentFilter(); 2352c15966f8cf6160ad5dcbbde372508de89985829Xia Wang mIntentFilter.addAction(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION); 2362c15966f8cf6160ad5dcbbde372508de89985829Xia Wang mIntentFilter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION); 2372c15966f8cf6160ad5dcbbde372508de89985829Xia Wang mIntentFilter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION); 238ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang mIntentFilter.addAction(WifiManager.SUPPLICANT_CONNECTION_CHANGE_ACTION); 2396026d52710d7a6195a33885020d29aa1330fa855Xia Wang mIntentFilter.addAction(WifiManager.WIFI_AP_STATE_CHANGED_ACTION); 2406026d52710d7a6195a33885020d29aa1330fa855Xia Wang mIntentFilter.addAction(ConnectivityManager.ACTION_TETHER_STATE_CHANGED); 2412c15966f8cf6160ad5dcbbde372508de89985829Xia Wang registerReceiver(mWifiReceiver, mIntentFilter); 2422c15966f8cf6160ad5dcbbde372508de89985829Xia Wang 2437fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang // Get an instance of ConnectivityManager 2447fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang mCM = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE); 2457fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang // Get an instance of WifiManager 2467fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang mWifiManager =(WifiManager)getSystemService(Context.WIFI_SERVICE); 24727284da88c4552c5be4c8eff8acd36b518da47daXia Wang mContext = this; 248ebe606fccd9293674273d5f73246e0e8e6e6ddcfIrfan Sheriff 2492f19a3103c2cdcf5613eb70493122fb366d509efXia Wang if (mWifiManager.isWifiApEnabled()) { 2502f19a3103c2cdcf5613eb70493122fb366d509efXia Wang // if soft AP is enabled, disable it 2512f19a3103c2cdcf5613eb70493122fb366d509efXia Wang mWifiManager.setWifiApEnabled(null, false); 2522f19a3103c2cdcf5613eb70493122fb366d509efXia Wang log("Disable soft ap"); 2532f19a3103c2cdcf5613eb70493122fb366d509efXia Wang } 2547fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang 2552f19a3103c2cdcf5613eb70493122fb366d509efXia Wang initializeNetworkStates(); 256dddfaa75e77f4d02cc7b4180f5eb0679321cb628Xia Wang log("Clear Wifi before we start the test."); 257dddfaa75e77f4d02cc7b4180f5eb0679321cb628Xia Wang removeConfiguredNetworksAndDisableWifi(); 2586026d52710d7a6195a33885020d29aa1330fa855Xia Wang mWifiRegexs = mCM.getTetherableWifiRegexs(); 2597fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang } 2607fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang 261ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang public List<WifiConfiguration> loadNetworkConfigurations() throws Exception { 262ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang InputStream in = getAssets().open(ACCESS_POINT_FILE); 263a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang mParseHelper = new AccessPointParserHelper(in); 264a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang return mParseHelper.getNetworkConfigurations(); 265ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang } 266ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang 2677fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang // for each network type, initialize network states to UNKNOWN, and no verification flag is set 2687fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang public void initializeNetworkStates() { 2697fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang for (int networkType = NUM_NETWORK_TYPES - 1; networkType >=0; networkType--) { 2707fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang connectivityState[networkType] = new NetworkState(); 271a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang log("Initialize network state for " + networkType + ": " + 2727fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang connectivityState[networkType].toString()); 2737fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang } 2747fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang } 2757fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang 2767fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang // deposit a network state 2777fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang public void recordNetworkState(int networkType, State networkState) { 278a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang log("record network state for network " + networkType + 2792c15966f8cf6160ad5dcbbde372508de89985829Xia Wang ", state is " + networkState); 2807fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang connectivityState[networkType].recordState(networkState); 2817fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang } 2827fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang 2837fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang // set the state transition criteria 2847fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang public void setStateTransitionCriteria(int networkType, State initState, 2857fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang int transitionDir, State targetState) { 2867fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang connectivityState[networkType].setStateTransitionCriteria( 2877fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang initState, transitionDir, targetState); 2887fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang } 2897fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang 2907fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang // Validate the states recorded 2917fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang public boolean validateNetworkStates(int networkType) { 292a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang log("validate network state for " + networkType + ": "); 2937fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang return connectivityState[networkType].validateStateTransition(); 2947fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang } 2957fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang 2967fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang // return result from network state validation 2977fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang public String getTransitionFailureReason(int networkType) { 298a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang log("get network state transition failure reason for " + networkType + ": " + 2997fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang connectivityState[networkType].toString()); 3007fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang return connectivityState[networkType].getReason(); 3017fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang } 3027fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang 3032c15966f8cf6160ad5dcbbde372508de89985829Xia Wang private void notifyNetworkConnectivityChange() { 3042c15966f8cf6160ad5dcbbde372508de89985829Xia Wang synchronized(connectivityObject) { 305a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang log("notify network connectivity changed"); 3062c15966f8cf6160ad5dcbbde372508de89985829Xia Wang connectivityObject.notifyAll(); 3072c15966f8cf6160ad5dcbbde372508de89985829Xia Wang } 3082c15966f8cf6160ad5dcbbde372508de89985829Xia Wang } 3097fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang private void notifyScanResult() { 3107fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang synchronized (this) { 311a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang log("notify that scan results are available"); 31290e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang scanResultAvailable = true; 3137fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang this.notify(); 3147fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang } 3157fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang } 3167fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang 3176026d52710d7a6195a33885020d29aa1330fa855Xia Wang private void notifyWifiState() { 3182c15966f8cf6160ad5dcbbde372508de89985829Xia Wang synchronized (wifiObject) { 319a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang log("notify wifi state changed"); 3202c15966f8cf6160ad5dcbbde372508de89985829Xia Wang wifiObject.notify(); 3212c15966f8cf6160ad5dcbbde372508de89985829Xia Wang } 3222c15966f8cf6160ad5dcbbde372508de89985829Xia Wang } 3232c15966f8cf6160ad5dcbbde372508de89985829Xia Wang 3246026d52710d7a6195a33885020d29aa1330fa855Xia Wang private void notifyWifiAPState() { 3256026d52710d7a6195a33885020d29aa1330fa855Xia Wang synchronized (this) { 326a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang log("notify wifi AP state changed"); 3276026d52710d7a6195a33885020d29aa1330fa855Xia Wang this.notify(); 3286026d52710d7a6195a33885020d29aa1330fa855Xia Wang } 3296026d52710d7a6195a33885020d29aa1330fa855Xia Wang } 3306026d52710d7a6195a33885020d29aa1330fa855Xia Wang 3316026d52710d7a6195a33885020d29aa1330fa855Xia Wang // Update wifi tethering state 3326026d52710d7a6195a33885020d29aa1330fa855Xia Wang private void updateTetherState(Object[] available, Object[] tethered, Object[] errored) { 3336026d52710d7a6195a33885020d29aa1330fa855Xia Wang boolean wifiTethered = false; 3346026d52710d7a6195a33885020d29aa1330fa855Xia Wang boolean wifiErrored = false; 3356026d52710d7a6195a33885020d29aa1330fa855Xia Wang 3366026d52710d7a6195a33885020d29aa1330fa855Xia Wang synchronized (this) { 3376026d52710d7a6195a33885020d29aa1330fa855Xia Wang for (Object obj: tethered) { 3386026d52710d7a6195a33885020d29aa1330fa855Xia Wang String str = (String)obj; 3396026d52710d7a6195a33885020d29aa1330fa855Xia Wang for (String tethRex: mWifiRegexs) { 340a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang log("str: " + str +"tethRex: " + tethRex); 3416026d52710d7a6195a33885020d29aa1330fa855Xia Wang if (str.matches(tethRex)) { 3426026d52710d7a6195a33885020d29aa1330fa855Xia Wang wifiTethered = true; 3436026d52710d7a6195a33885020d29aa1330fa855Xia Wang } 3446026d52710d7a6195a33885020d29aa1330fa855Xia Wang } 3456026d52710d7a6195a33885020d29aa1330fa855Xia Wang } 3466026d52710d7a6195a33885020d29aa1330fa855Xia Wang 3476026d52710d7a6195a33885020d29aa1330fa855Xia Wang for (Object obj: errored) { 3486026d52710d7a6195a33885020d29aa1330fa855Xia Wang String str = (String)obj; 3496026d52710d7a6195a33885020d29aa1330fa855Xia Wang for (String tethRex: mWifiRegexs) { 350a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang log("error: str: " + str +"tethRex: " + tethRex); 3516026d52710d7a6195a33885020d29aa1330fa855Xia Wang if (str.matches(tethRex)) { 3526026d52710d7a6195a33885020d29aa1330fa855Xia Wang wifiErrored = true; 3536026d52710d7a6195a33885020d29aa1330fa855Xia Wang } 3546026d52710d7a6195a33885020d29aa1330fa855Xia Wang } 3556026d52710d7a6195a33885020d29aa1330fa855Xia Wang } 3566026d52710d7a6195a33885020d29aa1330fa855Xia Wang 3576026d52710d7a6195a33885020d29aa1330fa855Xia Wang if (wifiTethered) { 3586026d52710d7a6195a33885020d29aa1330fa855Xia Wang mWifiTetherResult = SUCCESS; // wifi tethering is successful 3596026d52710d7a6195a33885020d29aa1330fa855Xia Wang } else if (wifiErrored) { 3606026d52710d7a6195a33885020d29aa1330fa855Xia Wang mWifiTetherResult = FAILURE; // wifi tethering failed 3616026d52710d7a6195a33885020d29aa1330fa855Xia Wang } 362a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang log("mWifiTetherResult: " + mWifiTetherResult); 3636026d52710d7a6195a33885020d29aa1330fa855Xia Wang this.notify(); 3646026d52710d7a6195a33885020d29aa1330fa855Xia Wang } 3656026d52710d7a6195a33885020d29aa1330fa855Xia Wang } 3666026d52710d7a6195a33885020d29aa1330fa855Xia Wang 3676026d52710d7a6195a33885020d29aa1330fa855Xia Wang 368ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang // Wait for network connectivity state: CONNECTING, CONNECTED, SUSPENDED, 369ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang // DISCONNECTING, DISCONNECTED, UNKNOWN 370ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang public boolean waitForNetworkState(int networkType, State expectedState, long timeout) { 371ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang long startTime = System.currentTimeMillis(); 372ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang while (true) { 373ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang if ((System.currentTimeMillis() - startTime) > timeout) { 37490e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang log("waitForNetworkState time out, the state of network type " + networkType + 37590e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang " is: " + mCM.getNetworkInfo(networkType).getState()); 376ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang if (mCM.getNetworkInfo(networkType).getState() != expectedState) { 377ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang return false; 378ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang } else { 379ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang // the broadcast has been sent out. the state has been changed. 380a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang log("networktype: " + networkType + " state: " + 381ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang mCM.getNetworkInfo(networkType)); 382ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang return true; 383ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang } 384ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang } 385a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang log("Wait for the connectivity state for network: " + networkType + 386ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang " to be " + expectedState.toString()); 387ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang synchronized (connectivityObject) { 388ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang try { 389ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang connectivityObject.wait(SHORT_TIMEOUT); 390ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang } catch (InterruptedException e) { 391ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang e.printStackTrace(); 392ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang } 393ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang if ((mNetworkInfo.getType() != networkType) || 394ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang (mNetworkInfo.getState() != expectedState)) { 395a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang log("network state for " + mNetworkInfo.getType() + 396ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang "is: " + mNetworkInfo.getState()); 397ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang continue; 398ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang } 399ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang return true; 400ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang } 401ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang } 402ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang } 403ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang 404ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang // Wait for Wifi state: WIFI_STATE_DISABLED, WIFI_STATE_DISABLING, WIFI_STATE_ENABLED, 405ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang // WIFI_STATE_ENALBING, WIFI_STATE_UNKNOWN 406ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang public boolean waitForWifiState(int expectedState, long timeout) { 407ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang long startTime = System.currentTimeMillis(); 408ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang while (true) { 409ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang if ((System.currentTimeMillis() - startTime) > timeout) { 410ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang if (mWifiState != expectedState) { 411ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang return false; 412ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang } else { 413ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang return true; 414ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang } 415ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang } 416a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang log("Wait for wifi state to be: " + expectedState); 417ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang synchronized (wifiObject) { 418ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang try { 419ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang wifiObject.wait(SHORT_TIMEOUT); 420ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang } catch (InterruptedException e) { 421ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang e.printStackTrace(); 422ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang } 423ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang if (mWifiState != expectedState) { 424a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang log("Wifi state is: " + mWifiState); 425ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang continue; 426ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang } 427ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang return true; 428ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang } 429ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang } 430ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang } 431ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang 4326026d52710d7a6195a33885020d29aa1330fa855Xia Wang // Wait for Wifi AP state: WIFI_AP_STATE_DISABLED, WIFI_AP_STATE_DISABLING, 4336026d52710d7a6195a33885020d29aa1330fa855Xia Wang // WIFI_AP_STATE_ENABLED, WIFI_STATE_ENALBING, WIFI_STATE_UNKNOWN 4346026d52710d7a6195a33885020d29aa1330fa855Xia Wang public boolean waitForWifiAPState(int expectedState, long timeout) { 4356026d52710d7a6195a33885020d29aa1330fa855Xia Wang long startTime = System.currentTimeMillis(); 4366026d52710d7a6195a33885020d29aa1330fa855Xia Wang while (true) { 4376026d52710d7a6195a33885020d29aa1330fa855Xia Wang if ((System.currentTimeMillis() - startTime) > timeout) { 4386026d52710d7a6195a33885020d29aa1330fa855Xia Wang if (mWifiManager.getWifiApState() != expectedState) { 4396026d52710d7a6195a33885020d29aa1330fa855Xia Wang return false; 4406026d52710d7a6195a33885020d29aa1330fa855Xia Wang } else { 4416026d52710d7a6195a33885020d29aa1330fa855Xia Wang return true; 4426026d52710d7a6195a33885020d29aa1330fa855Xia Wang } 4436026d52710d7a6195a33885020d29aa1330fa855Xia Wang } 444a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang log("Wait for wifi AP state to be: " + expectedState); 4456026d52710d7a6195a33885020d29aa1330fa855Xia Wang synchronized (wifiObject) { 4466026d52710d7a6195a33885020d29aa1330fa855Xia Wang try { 4476026d52710d7a6195a33885020d29aa1330fa855Xia Wang wifiObject.wait(SHORT_TIMEOUT); 4486026d52710d7a6195a33885020d29aa1330fa855Xia Wang } catch (InterruptedException e) { 4496026d52710d7a6195a33885020d29aa1330fa855Xia Wang e.printStackTrace(); 4506026d52710d7a6195a33885020d29aa1330fa855Xia Wang } 4516026d52710d7a6195a33885020d29aa1330fa855Xia Wang if (mWifiManager.getWifiApState() != expectedState) { 452a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang log("Wifi state is: " + mWifiManager.getWifiApState()); 4536026d52710d7a6195a33885020d29aa1330fa855Xia Wang continue; 4546026d52710d7a6195a33885020d29aa1330fa855Xia Wang } 4556026d52710d7a6195a33885020d29aa1330fa855Xia Wang return true; 4566026d52710d7a6195a33885020d29aa1330fa855Xia Wang } 4576026d52710d7a6195a33885020d29aa1330fa855Xia Wang } 4586026d52710d7a6195a33885020d29aa1330fa855Xia Wang } 4596026d52710d7a6195a33885020d29aa1330fa855Xia Wang 4606026d52710d7a6195a33885020d29aa1330fa855Xia Wang /** 4616026d52710d7a6195a33885020d29aa1330fa855Xia Wang * Wait for the wifi tethering result: 4626026d52710d7a6195a33885020d29aa1330fa855Xia Wang * @param timeout is the maximum waiting time 4636026d52710d7a6195a33885020d29aa1330fa855Xia Wang * @return SUCCESS if tethering result is successful 4646026d52710d7a6195a33885020d29aa1330fa855Xia Wang * FAILURE if tethering result returns error. 4656026d52710d7a6195a33885020d29aa1330fa855Xia Wang */ 4666026d52710d7a6195a33885020d29aa1330fa855Xia Wang public int waitForTetherStateChange(long timeout) { 4676026d52710d7a6195a33885020d29aa1330fa855Xia Wang long startTime = System.currentTimeMillis(); 4686026d52710d7a6195a33885020d29aa1330fa855Xia Wang while (true) { 4696026d52710d7a6195a33885020d29aa1330fa855Xia Wang if ((System.currentTimeMillis() - startTime) > timeout) { 4706026d52710d7a6195a33885020d29aa1330fa855Xia Wang return mWifiTetherResult; 4716026d52710d7a6195a33885020d29aa1330fa855Xia Wang } 472a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang log("Wait for wifi tethering result."); 4736026d52710d7a6195a33885020d29aa1330fa855Xia Wang synchronized (this) { 4746026d52710d7a6195a33885020d29aa1330fa855Xia Wang try { 4756026d52710d7a6195a33885020d29aa1330fa855Xia Wang this.wait(SHORT_TIMEOUT); 4766026d52710d7a6195a33885020d29aa1330fa855Xia Wang } catch (InterruptedException e) { 4776026d52710d7a6195a33885020d29aa1330fa855Xia Wang e.printStackTrace(); 4786026d52710d7a6195a33885020d29aa1330fa855Xia Wang } 4796026d52710d7a6195a33885020d29aa1330fa855Xia Wang if (mWifiTetherResult == INIT ) { 4806026d52710d7a6195a33885020d29aa1330fa855Xia Wang continue; 4816026d52710d7a6195a33885020d29aa1330fa855Xia Wang } else { 4826026d52710d7a6195a33885020d29aa1330fa855Xia Wang return mWifiTetherResult; 4836026d52710d7a6195a33885020d29aa1330fa855Xia Wang } 4846026d52710d7a6195a33885020d29aa1330fa855Xia Wang } 4856026d52710d7a6195a33885020d29aa1330fa855Xia Wang } 4866026d52710d7a6195a33885020d29aa1330fa855Xia Wang } 4876026d52710d7a6195a33885020d29aa1330fa855Xia Wang 4887fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang // Return true if device is currently connected to mobile network 4897fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang public boolean isConnectedToMobile() { 4907fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang return (mNetworkInfo.getType() == ConnectivityManager.TYPE_MOBILE); 4917fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang } 4927fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang 4937fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang // Return true if device is currently connected to Wifi 4947fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang public boolean isConnectedToWifi() { 4957fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang return (mNetworkInfo.getType() == ConnectivityManager.TYPE_WIFI); 4967fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang } 4977fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang 4987fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang public boolean enableWifi() { 4997fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang return mWifiManager.setWifiEnabled(true); 5007fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang } 5017fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang 50273055f12d7764e322f3f83717525a2dba01f9ef9Xia Wang // Turn screen off 50373055f12d7764e322f3f83717525a2dba01f9ef9Xia Wang public void turnScreenOff() { 50473055f12d7764e322f3f83717525a2dba01f9ef9Xia Wang log("Turn screen off"); 50573055f12d7764e322f3f83717525a2dba01f9ef9Xia Wang PowerManager pm = 50673055f12d7764e322f3f83717525a2dba01f9ef9Xia Wang (PowerManager) getSystemService(Context.POWER_SERVICE); 5079630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown pm.goToSleep(SystemClock.uptimeMillis()); 50873055f12d7764e322f3f83717525a2dba01f9ef9Xia Wang } 50973055f12d7764e322f3f83717525a2dba01f9ef9Xia Wang 51073055f12d7764e322f3f83717525a2dba01f9ef9Xia Wang // Turn screen on 51173055f12d7764e322f3f83717525a2dba01f9ef9Xia Wang public void turnScreenOn() { 51273055f12d7764e322f3f83717525a2dba01f9ef9Xia Wang log("Turn screen on"); 5139630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown PowerManager pm = 5149630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown (PowerManager) getSystemService(Context.POWER_SERVICE); 5159630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown pm.wakeUp(SystemClock.uptimeMillis()); 51673055f12d7764e322f3f83717525a2dba01f9ef9Xia Wang } 51773055f12d7764e322f3f83717525a2dba01f9ef9Xia Wang 5187fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang /** 5196bffe14c78efa0b56327262543ce2e0dfc024219Xia Wang * @param pingServerList a list of servers that can be used for ping test, can be null 5206bffe14c78efa0b56327262543ce2e0dfc024219Xia Wang * @return true if the ping test is successful, false otherwise. 5216bffe14c78efa0b56327262543ce2e0dfc024219Xia Wang */ 5226bffe14c78efa0b56327262543ce2e0dfc024219Xia Wang public boolean pingTest(String[] pingServerList) { 5236bffe14c78efa0b56327262543ce2e0dfc024219Xia Wang String[] hostList = {"www.google.com", "www.yahoo.com", 5246bffe14c78efa0b56327262543ce2e0dfc024219Xia Wang "www.bing.com", "www.facebook.com", "www.ask.com"}; 5256bffe14c78efa0b56327262543ce2e0dfc024219Xia Wang if (pingServerList != null) { 5266bffe14c78efa0b56327262543ce2e0dfc024219Xia Wang hostList = pingServerList; 5276bffe14c78efa0b56327262543ce2e0dfc024219Xia Wang } 528b2a2096903342a9eaba0b8f64f0f549e5277b662Xia Wang 529b2a2096903342a9eaba0b8f64f0f549e5277b662Xia Wang long startTime = System.currentTimeMillis(); 530b2a2096903342a9eaba0b8f64f0f549e5277b662Xia Wang while ((System.currentTimeMillis() - startTime) < PING_TIMER) { 531b2a2096903342a9eaba0b8f64f0f549e5277b662Xia Wang try { 532b2a2096903342a9eaba0b8f64f0f549e5277b662Xia Wang // assume the chance that all servers are down is very small 533b2a2096903342a9eaba0b8f64f0f549e5277b662Xia Wang for (int i = 0; i < hostList.length; i++ ) { 534b2a2096903342a9eaba0b8f64f0f549e5277b662Xia Wang String host = hostList[i]; 535b2a2096903342a9eaba0b8f64f0f549e5277b662Xia Wang log("Start ping test, ping " + host); 536b2a2096903342a9eaba0b8f64f0f549e5277b662Xia Wang Process p = Runtime.getRuntime().exec("ping -c 10 -w 100 " + host); 537b2a2096903342a9eaba0b8f64f0f549e5277b662Xia Wang int status = p.waitFor(); 538b2a2096903342a9eaba0b8f64f0f549e5277b662Xia Wang if (status == 0) { 539b2a2096903342a9eaba0b8f64f0f549e5277b662Xia Wang // if any of the ping test is successful, return true 540b2a2096903342a9eaba0b8f64f0f549e5277b662Xia Wang return true; 541b2a2096903342a9eaba0b8f64f0f549e5277b662Xia Wang } 5426bffe14c78efa0b56327262543ce2e0dfc024219Xia Wang } 543b2a2096903342a9eaba0b8f64f0f549e5277b662Xia Wang } catch (UnknownHostException e) { 544b2a2096903342a9eaba0b8f64f0f549e5277b662Xia Wang log("Ping test Fail: Unknown Host"); 545b2a2096903342a9eaba0b8f64f0f549e5277b662Xia Wang } catch (IOException e) { 546b2a2096903342a9eaba0b8f64f0f549e5277b662Xia Wang log("Ping test Fail: IOException"); 547b2a2096903342a9eaba0b8f64f0f549e5277b662Xia Wang } catch (InterruptedException e) { 548b2a2096903342a9eaba0b8f64f0f549e5277b662Xia Wang log("Ping test Fail: InterruptedException"); 5496bffe14c78efa0b56327262543ce2e0dfc024219Xia Wang } 5506bffe14c78efa0b56327262543ce2e0dfc024219Xia Wang } 551b2a2096903342a9eaba0b8f64f0f549e5277b662Xia Wang // ping test timeout 552b2a2096903342a9eaba0b8f64f0f549e5277b662Xia Wang return false; 5536bffe14c78efa0b56327262543ce2e0dfc024219Xia Wang } 5546bffe14c78efa0b56327262543ce2e0dfc024219Xia Wang 5556bffe14c78efa0b56327262543ce2e0dfc024219Xia Wang /** 5567fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang * Associate the device to given SSID 5577fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang * If the device is already associated with a WiFi, disconnect and forget it, 5587fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang * We don't verify whether the connection is successful or not, leave this to the test 5597fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang */ 5607fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang public boolean connectToWifi(String knownSSID) { 561ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang WifiConfiguration config = new WifiConfiguration(); 562ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang config.SSID = knownSSID; 563ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang config.allowedKeyManagement.set(KeyMgmt.NONE); 564ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang return connectToWifiWithConfiguration(config); 565ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang } 566ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang 567ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang /** 568ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang * Connect to Wi-Fi with the given configuration. Note the SSID in the configuration 569ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang * is pure string, we need to convert it to quoted string. 570ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang * @param config 571ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang * @return 572ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang */ 573ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang public boolean connectToWifiWithConfiguration(WifiConfiguration config) { 574ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang String ssid = config.SSID; 575ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang config.SSID = convertToQuotedString(ssid); 576ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang 577f2991add02f3e6f50dd65a835fffec3aa7221769Xia Wang // If Wifi is not enabled, enable it 5787fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang if (!mWifiManager.isWifiEnabled()) { 579a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang log("Wifi is not enabled, enable it"); 5807fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang mWifiManager.setWifiEnabled(true); 581a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang // wait for the wifi state change before start scanning. 582a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang if (!waitForWifiState(WifiManager.WIFI_STATE_ENABLED, 2*SHORT_TIMEOUT)) { 583a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang log("wait for WIFI_STATE_ENABLED failed"); 584a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang return false; 585a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang } 5867fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang } 5877fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang 588f2991add02f3e6f50dd65a835fffec3aa7221769Xia Wang // Save network configuration and connect to network without scanning 589f2991add02f3e6f50dd65a835fffec3aa7221769Xia Wang mWifiManager.connect(config, 590f2991add02f3e6f50dd65a835fffec3aa7221769Xia Wang new WifiManager.ActionListener() { 591f2991add02f3e6f50dd65a835fffec3aa7221769Xia Wang public void onSuccess() { 5927fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang } 593f2991add02f3e6f50dd65a835fffec3aa7221769Xia Wang public void onFailure(int reason) { 594f2991add02f3e6f50dd65a835fffec3aa7221769Xia Wang log("connect failure " + reason); 5957fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang } 596f2991add02f3e6f50dd65a835fffec3aa7221769Xia Wang }); 597f2991add02f3e6f50dd65a835fffec3aa7221769Xia Wang return true; 5987fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang } 5997fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang 6002c15966f8cf6160ad5dcbbde372508de89985829Xia Wang /* 601ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang * Disconnect from the current AP and remove configured networks. 6027fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang */ 6032c15966f8cf6160ad5dcbbde372508de89985829Xia Wang public boolean disconnectAP() { 604dddfaa75e77f4d02cc7b4180f5eb0679321cb628Xia Wang // remove saved networks 60581341fee6de80d8808afd8af3009258660a8f834Xia Wang if (!mWifiManager.isWifiEnabled()) { 60681341fee6de80d8808afd8af3009258660a8f834Xia Wang log("Enabled wifi before remove configured networks"); 60781341fee6de80d8808afd8af3009258660a8f834Xia Wang mWifiManager.setWifiEnabled(true); 60881341fee6de80d8808afd8af3009258660a8f834Xia Wang sleep(SHORT_TIMEOUT); 60981341fee6de80d8808afd8af3009258660a8f834Xia Wang } 610dddfaa75e77f4d02cc7b4180f5eb0679321cb628Xia Wang List<WifiConfiguration> wifiConfigList = mWifiManager.getConfiguredNetworks(); 611dddfaa75e77f4d02cc7b4180f5eb0679321cb628Xia Wang log("size of wifiConfigList: " + wifiConfigList.size()); 612dddfaa75e77f4d02cc7b4180f5eb0679321cb628Xia Wang for (WifiConfiguration wifiConfig: wifiConfigList) { 613dddfaa75e77f4d02cc7b4180f5eb0679321cb628Xia Wang log("remove wifi configuration: " + wifiConfig.networkId); 614dddfaa75e77f4d02cc7b4180f5eb0679321cb628Xia Wang int netId = wifiConfig.networkId; 61588759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff mWifiManager.forget(netId, new WifiManager.ActionListener() { 616d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff public void onSuccess() { 617d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff } 618d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff public void onFailure(int reason) { 619d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff log("Failed to forget " + reason); 620d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff } 621d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff }); 6222c15966f8cf6160ad5dcbbde372508de89985829Xia Wang } 6232c15966f8cf6160ad5dcbbde372508de89985829Xia Wang return true; 6242c15966f8cf6160ad5dcbbde372508de89985829Xia Wang } 6252c15966f8cf6160ad5dcbbde372508de89985829Xia Wang /** 6262c15966f8cf6160ad5dcbbde372508de89985829Xia Wang * Disable Wifi 6272c15966f8cf6160ad5dcbbde372508de89985829Xia Wang * @return true if Wifi is disabled successfully 6282c15966f8cf6160ad5dcbbde372508de89985829Xia Wang */ 6292c15966f8cf6160ad5dcbbde372508de89985829Xia Wang public boolean disableWifi() { 6302c15966f8cf6160ad5dcbbde372508de89985829Xia Wang return mWifiManager.setWifiEnabled(false); 6312c15966f8cf6160ad5dcbbde372508de89985829Xia Wang } 6322c15966f8cf6160ad5dcbbde372508de89985829Xia Wang 6332c15966f8cf6160ad5dcbbde372508de89985829Xia Wang /** 634ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang * Remove configured networks and disable wifi 6352c15966f8cf6160ad5dcbbde372508de89985829Xia Wang */ 636ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang public boolean removeConfiguredNetworksAndDisableWifi() { 637dddfaa75e77f4d02cc7b4180f5eb0679321cb628Xia Wang if (!disconnectAP()) { 638dddfaa75e77f4d02cc7b4180f5eb0679321cb628Xia Wang return false; 639dddfaa75e77f4d02cc7b4180f5eb0679321cb628Xia Wang } 640dddfaa75e77f4d02cc7b4180f5eb0679321cb628Xia Wang sleep(SHORT_TIMEOUT); 641dddfaa75e77f4d02cc7b4180f5eb0679321cb628Xia Wang if (!mWifiManager.setWifiEnabled(false)) { 642dddfaa75e77f4d02cc7b4180f5eb0679321cb628Xia Wang return false; 643dddfaa75e77f4d02cc7b4180f5eb0679321cb628Xia Wang } 644dddfaa75e77f4d02cc7b4180f5eb0679321cb628Xia Wang sleep(SHORT_TIMEOUT); 6457fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang return true; 6467fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang } 6477fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang 648dddfaa75e77f4d02cc7b4180f5eb0679321cb628Xia Wang private void sleep(long sleeptime) { 649dddfaa75e77f4d02cc7b4180f5eb0679321cb628Xia Wang try { 650dddfaa75e77f4d02cc7b4180f5eb0679321cb628Xia Wang Thread.sleep(sleeptime); 651dddfaa75e77f4d02cc7b4180f5eb0679321cb628Xia Wang } catch (InterruptedException e) {} 652dddfaa75e77f4d02cc7b4180f5eb0679321cb628Xia Wang } 653dddfaa75e77f4d02cc7b4180f5eb0679321cb628Xia Wang 6547fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang /** 6557fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang * Set airplane mode 6567fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang */ 6577fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang public void setAirplaneMode(Context context, boolean enableAM) { 6587fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang //set the airplane mode 659c09cdce1b05075da808ae080b9905a14a3e1e627Christopher Tate Settings.Global.putInt(context.getContentResolver(), Settings.Global.AIRPLANE_MODE_ON, 6607fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang enableAM ? 1 : 0); 6617fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang // Post the intent 6627fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang Intent intent = new Intent(Intent.ACTION_AIRPLANE_MODE_CHANGED); 6637fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang intent.putExtra("state", enableAM); 664c09cdce1b05075da808ae080b9905a14a3e1e627Christopher Tate context.sendBroadcastAsUser(intent, UserHandle.ALL); 6657fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang } 6667fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang 667069067963cf0117cfb4a1aef99b550b126d9ca92Xia Wang protected static String convertToQuotedString(String string) { 668069067963cf0117cfb4a1aef99b550b126d9ca92Xia Wang return "\"" + string + "\""; 669069067963cf0117cfb4a1aef99b550b126d9ca92Xia Wang } 670069067963cf0117cfb4a1aef99b550b126d9ca92Xia Wang 6717fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang @Override 6727fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang protected void onDestroy() { 6737fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang super.onDestroy(); 6747fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang 6757fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang //Unregister receiver 6767fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang if (mConnectivityReceiver != null) { 6777fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang unregisterReceiver(mConnectivityReceiver); 6787fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang } 6797fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang if (mWifiReceiver != null) { 6807fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang unregisterReceiver(mWifiReceiver); 6817fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang } 682a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang log("onDestroy, inst=" + Integer.toHexString(hashCode())); 6837fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang } 684ba1348e3c21502ecde9427413703defa6d105132Yu Shan Emily Lau 685ba1348e3c21502ecde9427413703defa6d105132Yu Shan Emily Lau @Override 686ba1348e3c21502ecde9427413703defa6d105132Yu Shan Emily Lau public void onStart() { 687ba1348e3c21502ecde9427413703defa6d105132Yu Shan Emily Lau super.onStart(); 688ba1348e3c21502ecde9427413703defa6d105132Yu Shan Emily Lau mContext = this; 689ba1348e3c21502ecde9427413703defa6d105132Yu Shan Emily Lau Bundle bundle = this.getIntent().getExtras(); 690ba1348e3c21502ecde9427413703defa6d105132Yu Shan Emily Lau if (bundle != null){ 691ba1348e3c21502ecde9427413703defa6d105132Yu Shan Emily Lau mPowerSsid = bundle.getString("power_ssid"); 692ba1348e3c21502ecde9427413703defa6d105132Yu Shan Emily Lau } 693ba1348e3c21502ecde9427413703defa6d105132Yu Shan Emily Lau } 694ba1348e3c21502ecde9427413703defa6d105132Yu Shan Emily Lau //A thread to set the device into airplane mode then turn on wifi. 695ba1348e3c21502ecde9427413703defa6d105132Yu Shan Emily Lau Thread setDeviceWifiAndAirplaneThread = new Thread(new Runnable() { 696ba1348e3c21502ecde9427413703defa6d105132Yu Shan Emily Lau public void run() { 697ba1348e3c21502ecde9427413703defa6d105132Yu Shan Emily Lau setAirplaneMode(mContext, true); 698ba1348e3c21502ecde9427413703defa6d105132Yu Shan Emily Lau connectToWifi(mPowerSsid); 699ba1348e3c21502ecde9427413703defa6d105132Yu Shan Emily Lau } 700ba1348e3c21502ecde9427413703defa6d105132Yu Shan Emily Lau }); 701ba1348e3c21502ecde9427413703defa6d105132Yu Shan Emily Lau 702ba1348e3c21502ecde9427413703defa6d105132Yu Shan Emily Lau //A thread to set the device into wifi 703ba1348e3c21502ecde9427413703defa6d105132Yu Shan Emily Lau Thread setDeviceInWifiOnlyThread = new Thread(new Runnable() { 704ba1348e3c21502ecde9427413703defa6d105132Yu Shan Emily Lau public void run() { 705ba1348e3c21502ecde9427413703defa6d105132Yu Shan Emily Lau connectToWifi(mPowerSsid); 706ba1348e3c21502ecde9427413703defa6d105132Yu Shan Emily Lau } 707ba1348e3c21502ecde9427413703defa6d105132Yu Shan Emily Lau }); 708ba1348e3c21502ecde9427413703defa6d105132Yu Shan Emily Lau 709ba1348e3c21502ecde9427413703defa6d105132Yu Shan Emily Lau @Override 710ba1348e3c21502ecde9427413703defa6d105132Yu Shan Emily Lau public boolean onKeyDown(int keyCode, KeyEvent event) { 711ba1348e3c21502ecde9427413703defa6d105132Yu Shan Emily Lau switch (keyCode) { 712ba1348e3c21502ecde9427413703defa6d105132Yu Shan Emily Lau //This is a tricky way for the scripted monkey to 713ba1348e3c21502ecde9427413703defa6d105132Yu Shan Emily Lau //set the device in wifi and wifi in airplane mode. 714ba1348e3c21502ecde9427413703defa6d105132Yu Shan Emily Lau case KeyEvent.KEYCODE_1: 715ba1348e3c21502ecde9427413703defa6d105132Yu Shan Emily Lau setDeviceWifiAndAirplaneThread.start(); 716ba1348e3c21502ecde9427413703defa6d105132Yu Shan Emily Lau break; 717ba1348e3c21502ecde9427413703defa6d105132Yu Shan Emily Lau 718ba1348e3c21502ecde9427413703defa6d105132Yu Shan Emily Lau case KeyEvent.KEYCODE_2: 719ba1348e3c21502ecde9427413703defa6d105132Yu Shan Emily Lau setDeviceInWifiOnlyThread.start(); 720ba1348e3c21502ecde9427413703defa6d105132Yu Shan Emily Lau break; 721ba1348e3c21502ecde9427413703defa6d105132Yu Shan Emily Lau } 722ba1348e3c21502ecde9427413703defa6d105132Yu Shan Emily Lau return super.onKeyDown(keyCode, event); 723ba1348e3c21502ecde9427413703defa6d105132Yu Shan Emily Lau } 724a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang 725a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang private void log(String message) { 726a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang Log.v(LOG_TAG, message); 727a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang } 7287fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang} 729