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