ConnectivityManagerTestActivity.java revision 7fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6e
17fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wangpackage com.android.connectivitymanagertest; 27fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang 37fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wangimport android.app.Activity; 47fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wangimport android.content.Context; 57fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wangimport android.content.BroadcastReceiver; 67fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wangimport android.content.Intent; 77fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wangimport android.content.IntentFilter; 87fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wangimport android.os.Bundle; 97fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wangimport android.provider.Settings; 107fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wangimport android.util.Log; 117fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wangimport java.util.List; 127fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wangimport android.widget.LinearLayout; 137fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wangimport android.net.ConnectivityManager; 147fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wangimport android.net.NetworkInfo; 157fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wangimport android.net.NetworkInfo.State; 167fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang 177fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wangimport android.net.wifi.WifiConfiguration; 187fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wangimport android.net.wifi.WifiManager; 197fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wangimport android.net.wifi.ScanResult; 207fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wangimport android.net.wifi.WifiConfiguration.KeyMgmt; 217fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang 227fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang 237fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang/** 247fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang * An activity registered with connectivity manager broadcast 257fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang * provides network connectivity information and 267fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang * can be used to set device states: Cellular, Wifi, Airplane mode. 277fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang */ 287fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wangpublic class ConnectivityManagerTestActivity extends Activity { 297fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang 307fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang public static final String LOG_TAG = "ConnectivityManagerTestActivity"; 317fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang public static final int WAIT_FOR_SCAN_RESULT = 5 * 1000; //5 seconds 327fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang public static final int WIFI_SCAN_TIMEOUT = 20 * 1000; 337fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang public ConnectivityReceiver mConnectivityReceiver = null; 347fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang public WifiReceiver mWifiReceiver = null; 357fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang /* 367fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang * Track network connectivity information 377fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang */ 387fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang public State mState; 397fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang public NetworkInfo mNetworkInfo; 407fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang public NetworkInfo mOtherNetworkInfo; 417fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang public boolean mIsFailOver; 427fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang public String mReason; 437fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang public boolean mScanResultIsAvailable = false; 447fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang public ConnectivityManager mCM; 457fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang 467fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang /* 477fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang * Control Wifi States 487fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang */ 497fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang public WifiManager mWifiManager; 507fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang 517fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang /* 527fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang * Verify connectivity state 537fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang */ 547fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang public static final int NUM_NETWORK_TYPES = ConnectivityManager.MAX_NETWORK_TYPE; 557fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang NetworkState[] connectivityState = new NetworkState[NUM_NETWORK_TYPES]; 567fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang 577fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang /** 587fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang * A wrapper of a broadcast receiver which provides network connectivity information 597fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang * for all kinds of network: wifi, mobile, etc. 607fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang */ 617fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang private class ConnectivityReceiver extends BroadcastReceiver { 627fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang @Override 637fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang public void onReceive(Context context, Intent intent) { 647fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang String action = intent.getAction(); 657fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang if (!action.equals(ConnectivityManager.CONNECTIVITY_ACTION)) { 667fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang Log.v("ConnectivityReceiver", "onReceive() called with " + intent); 677fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang return; 687fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang } 697fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang 707fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang boolean noConnectivity = 717fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang intent.getBooleanExtra(ConnectivityManager.EXTRA_NO_CONNECTIVITY, false); 727fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang 737fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang if (noConnectivity) { 747fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang mState = State.DISCONNECTED; 757fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang } else { 767fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang mState = State.CONNECTED; 777fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang } 787fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang 797fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang mNetworkInfo = (NetworkInfo) 807fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang intent.getParcelableExtra(ConnectivityManager.EXTRA_NETWORK_INFO); 817fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang 827fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang mOtherNetworkInfo = (NetworkInfo) 837fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang intent.getParcelableExtra(ConnectivityManager.EXTRA_OTHER_NETWORK_INFO); 847fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang 857fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang mReason = intent.getStringExtra(ConnectivityManager.EXTRA_REASON); 867fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang mIsFailOver = intent.getBooleanExtra(ConnectivityManager.EXTRA_IS_FAILOVER, false); 877fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang recordNetworkState(mNetworkInfo.getType(), mNetworkInfo.getState()); 887fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang if (mOtherNetworkInfo != null) { 897fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang recordNetworkState(mOtherNetworkInfo.getType(), mOtherNetworkInfo.getState()); 907fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang } 917fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang } 927fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang } 937fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang 947fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang private class WifiReceiver extends BroadcastReceiver { 957fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang @Override 967fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang public void onReceive(Context context, Intent intent) { 977fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang String action = intent.getAction(); 987fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang if (!action.equals(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)) { 997fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang Log.v(LOG_TAG, "onReceive() is calleld with " + intent); 1007fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang return; 1017fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang } 1027fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang notifyScanResult(); 1037fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang } 1047fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang } 1057fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang 1067fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang public ConnectivityManagerTestActivity() { 1077fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang mState = State.UNKNOWN; 1087fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang } 1097fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang 1107fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang @Override 1117fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang protected void onCreate(Bundle savedInstanceState) { 1127fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang super.onCreate(savedInstanceState); 1137fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang Log.v(LOG_TAG, "onCreate, inst=" + Integer.toHexString(hashCode())); 1147fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang 1157fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang // Create a simple layout 1167fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang LinearLayout contentView = new LinearLayout(this); 1177fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang contentView.setOrientation(LinearLayout.VERTICAL); 1187fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang setContentView(contentView); 1197fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang setTitle("ConnectivityManagerTestActivity"); 1207fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang 1217fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang mConnectivityReceiver = new ConnectivityReceiver(); 1227fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang // register a connectivity receiver for CONNECTIVITY_ACTION; 1237fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang registerReceiver(mConnectivityReceiver, 1247fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION)); 1257fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang 1267fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang mWifiReceiver = new WifiReceiver(); 1277fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang registerReceiver(mWifiReceiver, 1287fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang new IntentFilter(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)); 1297fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang // Get an instance of ConnectivityManager 1307fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang mCM = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE); 1317fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang // Get an instance of WifiManager 1327fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang mWifiManager =(WifiManager)getSystemService(Context.WIFI_SERVICE); 1337fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang initializeNetworkStates(); 1347fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang 1357fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang if (mWifiManager.isWifiEnabled()) { 1367fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang Log.v(LOG_TAG, "Clear Wifi before we start the test."); 1377fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang clearWifi(); 1387fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang } 1397fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang } 1407fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang 1417fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang // for each network type, initialize network states to UNKNOWN, and no verification flag is set 1427fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang public void initializeNetworkStates() { 1437fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang for (int networkType = NUM_NETWORK_TYPES - 1; networkType >=0; networkType--) { 1447fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang connectivityState[networkType] = new NetworkState(); 1457fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang Log.v(LOG_TAG, "Initialize network state for " + networkType + ": " + 1467fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang connectivityState[networkType].toString()); 1477fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang } 1487fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang } 1497fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang 1507fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang // deposit a network state 1517fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang public void recordNetworkState(int networkType, State networkState) { 1527fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang Log.v(LOG_TAG, "record network state for network " + networkType + 1537fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang " state is " + networkState); 1547fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang connectivityState[networkType].recordState(networkState); 1557fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang } 1567fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang 1577fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang // set the state transition criteria 1587fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang public void setStateTransitionCriteria(int networkType, State initState, 1597fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang int transitionDir, State targetState) { 1607fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang connectivityState[networkType].setStateTransitionCriteria( 1617fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang initState, transitionDir, targetState); 1627fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang } 1637fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang 1647fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang // Validate the states recorded 1657fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang public boolean validateNetworkStates(int networkType) { 1667fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang Log.v(LOG_TAG, "validate network state for " + networkType + ": "); 1677fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang return connectivityState[networkType].validateStateTransition(); 1687fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang } 1697fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang 1707fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang // return result from network state validation 1717fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang public String getTransitionFailureReason(int networkType) { 1727fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang Log.v(LOG_TAG, "get network state transition failure reason for " + networkType + ": " + 1737fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang connectivityState[networkType].toString()); 1747fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang return connectivityState[networkType].getReason(); 1757fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang } 1767fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang 1777fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang private void notifyScanResult() { 1787fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang synchronized (this) { 1797fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang Log.v(LOG_TAG, "notify that scan results are available"); 1807fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang this.notify(); 1817fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang } 1827fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang } 1837fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang 1847fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang // Return true if device is currently connected to mobile network 1857fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang public boolean isConnectedToMobile() { 1867fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang return (mNetworkInfo.getType() == ConnectivityManager.TYPE_MOBILE); 1877fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang } 1887fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang 1897fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang // Return true if device is currently connected to Wifi 1907fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang public boolean isConnectedToWifi() { 1917fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang return (mNetworkInfo.getType() == ConnectivityManager.TYPE_WIFI); 1927fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang } 1937fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang 1947fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang public boolean enableWifi() { 1957fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang return mWifiManager.setWifiEnabled(true); 1967fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang } 1977fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang 1987fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang /** 1997fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang * Associate the device to given SSID 2007fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang * If the device is already associated with a WiFi, disconnect and forget it, 2017fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang * We don't verify whether the connection is successful or not, leave this to the test 2027fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang */ 2037fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang public boolean connectToWifi(String knownSSID) { 2047fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang //If Wifi is not enabled, enable it 2057fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang if (!mWifiManager.isWifiEnabled()) { 2067fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang Log.v(LOG_TAG, "Wifi is not enabled, enable it"); 2077fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang mWifiManager.setWifiEnabled(true); 2087fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang } 2097fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang 2107fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang List<ScanResult> netList = mWifiManager.getScanResults(); 2117fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang if (netList == null) { 2127fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang // if no scan results are available, start active scan 2137fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang mWifiManager.startScanActive(); 2147fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang mScanResultIsAvailable = false; 2157fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang long startTime = System.currentTimeMillis(); 2167fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang while (!mScanResultIsAvailable) { 2177fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang if ((System.currentTimeMillis() - startTime) > WIFI_SCAN_TIMEOUT) { 2187fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang return false; 2197fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang } 2207fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang // wait for the scan results to be available 2217fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang synchronized (this) { 2227fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang // wait for the scan result to be available 2237fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang try { 2247fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang this.wait(WAIT_FOR_SCAN_RESULT); 2257fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang } catch (InterruptedException e) { 2267fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang e.printStackTrace(); 2277fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang } 2287fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang if ((mWifiManager.getScanResults() == null) || 2297fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang (mWifiManager.getScanResults().size() <= 0)) { 2307fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang continue; 2317fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang } 2327fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang mScanResultIsAvailable = true; 2337fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang } 2347fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang } 2357fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang } 2367fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang 2377fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang netList = mWifiManager.getScanResults(); 2387fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang for (int i = 0; i < netList.size(); i++) { 2397fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang ScanResult sr= netList.get(i); 2407fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang if (sr.SSID.equals(knownSSID)) { 2417fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang Log.v(LOG_TAG, "found " + knownSSID + " in the scan result list"); 2427fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang WifiConfiguration config = new WifiConfiguration(); 2437fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang config.SSID = sr.SSID; 2447fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang config.allowedKeyManagement.set(KeyMgmt.NONE); 2457fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang int networkId = mWifiManager.addNetwork(config); 2467fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang mWifiManager.saveConfiguration(); 2477fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang // Connect to network by disabling others. 2487fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang mWifiManager.enableNetwork(networkId, true); 2497fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang mWifiManager.reconnect(); 2507fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang break; 2517fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang } 2527fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang } 2537fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang 2547fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang List<WifiConfiguration> netConfList = mWifiManager.getConfiguredNetworks(); 2557fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang if (netConfList.size() <= 0) { 2567fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang Log.v(LOG_TAG, knownSSID + " is not available"); 2577fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang return false; 2587fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang } 2597fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang return true; 2607fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang } 2617fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang 2627fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang /** 2637fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang * Disable Wifi 2647fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang * @return true if Wifi is disabled successfully 2657fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang */ 2667fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang public boolean disableWiFi() { 2677fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang return mWifiManager.setWifiEnabled(false); 2687fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang } 2697fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang 2707fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang /** 2717fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang * Disconnect from the current Wifi and clear the configuration list 2727fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang */ 2737fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang public boolean clearWifi() { 2747fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang if (mWifiManager.isWifiEnabled()) { 2757fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang //remove the current network Id 2767fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang int curNetworkId = mWifiManager.getConnectionInfo().getNetworkId(); 2777fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang mWifiManager.removeNetwork(curNetworkId); 2787fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang mWifiManager.saveConfiguration(); 2797fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang 2807fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang // remove other saved networks 2817fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang List<WifiConfiguration> netConfList = mWifiManager.getConfiguredNetworks(); 2827fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang if (netConfList != null) { 2837fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang Log.v(LOG_TAG, "remove configured network ids"); 2847fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang for (int i = 0; i < netConfList.size(); i++) { 2857fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang WifiConfiguration conf = new WifiConfiguration(); 2867fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang conf = netConfList.get(i); 2877fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang mWifiManager.removeNetwork(conf.networkId); 2887fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang } 2897fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang } 2907fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang mWifiManager.saveConfiguration(); 2917fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang // disable Wifi 2927fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang if (!mWifiManager.setWifiEnabled(false)) { 2937fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang return false; 2947fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang } 2957fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang // wait for the actions to be completed 2967fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang try { 2977fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang Thread.sleep(5*1000); 2987fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang } catch (InterruptedException e) {} 2997fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang } 3007fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang return true; 3017fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang } 3027fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang 3037fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang /** 3047fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang * Set airplane mode 3057fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang */ 3067fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang public void setAirplaneMode(Context context, boolean enableAM) { 3077fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang //set the airplane mode 3087fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang Settings.System.putInt(context.getContentResolver(), Settings.System.AIRPLANE_MODE_ON, 3097fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang enableAM ? 1 : 0); 3107fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang // Post the intent 3117fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang Intent intent = new Intent(Intent.ACTION_AIRPLANE_MODE_CHANGED); 3127fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang intent.putExtra("state", enableAM); 3137fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang context.sendBroadcast(intent); 3147fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang } 3157fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang 3167fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang @Override 3177fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang protected void onDestroy() { 3187fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang super.onDestroy(); 3197fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang 3207fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang //Unregister receiver 3217fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang if (mConnectivityReceiver != null) { 3227fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang unregisterReceiver(mConnectivityReceiver); 3237fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang } 3247fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang if (mWifiReceiver != null) { 3257fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang unregisterReceiver(mWifiReceiver); 3267fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang } 3277fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang Log.v(LOG_TAG, "onDestroy, inst=" + Integer.toHexString(hashCode())); 3287fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang } 3297fb1f674c90eb8f85f1d1ad7dab29ac65c15cb6eXia Wang} 330