diff options
Diffstat (limited to 'src/com/android/settings/wifi/WifiStatusTest.java')
-rw-r--r-- | src/com/android/settings/wifi/WifiStatusTest.java | 407 |
1 files changed, 407 insertions, 0 deletions
diff --git a/src/com/android/settings/wifi/WifiStatusTest.java b/src/com/android/settings/wifi/WifiStatusTest.java new file mode 100644 index 0000000..1b23834 --- /dev/null +++ b/src/com/android/settings/wifi/WifiStatusTest.java @@ -0,0 +1,407 @@ +/* + * Copyright (C) 2009 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.settings.wifi; + +import com.android.settings.R; +import android.net.wifi.ScanResult; +import org.apache.http.HttpResponse; +import org.apache.http.client.HttpClient; +import org.apache.http.client.methods.HttpGet; +import org.apache.http.impl.client.DefaultHttpClient; +import java.util.List; +import android.app.Activity; +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; +import android.net.NetworkInfo; +import android.net.wifi.SupplicantState; +import android.net.wifi.WifiInfo; +import android.net.wifi.WifiManager; +import android.os.Bundle; +import android.os.Handler; +import android.text.TextUtils; +import android.util.Log; +import android.view.View; +import android.view.View.OnClickListener; +import android.widget.Button; +import android.widget.TextView; +import java.io.IOException; +import java.net.UnknownHostException; + + +/** + * Show the current status details of Wifi related fields + */ +public class WifiStatusTest extends Activity { + + private static final String TAG = "WifiStatusTest"; + + private Button updateButton; + private TextView mWifiState; + private TextView mNetworkState; + private TextView mSupplicantState; + private TextView mRSSI; + private TextView mBSSID; + private TextView mSSID; + private TextView mHiddenSSID; + private TextView mIPAddr; + private TextView mMACAddr; + private TextView mNetworkId; + private TextView mLinkSpeed; + private TextView mScanList; + + + private TextView mPingIpAddr; + private TextView mPingHostname; + private TextView mHttpClientTest; + private Button pingTestButton; + + private String mPingIpAddrResult; + private String mPingHostnameResult; + private String mHttpClientTestResult; + + + private WifiManager mWifiManager; + private IntentFilter mWifiStateFilter; + + + //============================ + // Activity lifecycle + //============================ + + private final BroadcastReceiver mWifiStateReceiver = new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + if (intent.getAction().equals(WifiManager.WIFI_STATE_CHANGED_ACTION)) { + handleWifiStateChanged(intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE, + WifiManager.WIFI_STATE_UNKNOWN)); + } else if (intent.getAction().equals(WifiManager.NETWORK_STATE_CHANGED_ACTION)) { + handleNetworkStateChanged( + (NetworkInfo) intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO)); + } else if (intent.getAction().equals(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)) { + handleScanResultsAvailable(); + } else if (intent.getAction().equals(WifiManager.SUPPLICANT_CONNECTION_CHANGE_ACTION)) { + /* TODO: handle supplicant connection change later */ + } else if (intent.getAction().equals(WifiManager.SUPPLICANT_STATE_CHANGED_ACTION)) { + handleSupplicantStateChanged( + (SupplicantState) intent.getParcelableExtra(WifiManager.EXTRA_NEW_STATE), + intent.hasExtra(WifiManager.EXTRA_SUPPLICANT_ERROR), + intent.getIntExtra(WifiManager.EXTRA_SUPPLICANT_ERROR, 0)); + } else if (intent.getAction().equals(WifiManager.RSSI_CHANGED_ACTION)) { + handleSignalChanged(intent.getIntExtra(WifiManager.EXTRA_NEW_RSSI, 0)); + } else if (intent.getAction().equals(WifiManager.NETWORK_IDS_CHANGED_ACTION)) { + /* TODO: handle network id change info later */ + } else { + Log.e(TAG, "Received an unknown Wifi Intent"); + } + } + }; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + mWifiManager = (WifiManager) getSystemService(WIFI_SERVICE); + + mWifiStateFilter = new IntentFilter(WifiManager.WIFI_STATE_CHANGED_ACTION); + mWifiStateFilter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION); + mWifiStateFilter.addAction(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION); + mWifiStateFilter.addAction(WifiManager.SUPPLICANT_STATE_CHANGED_ACTION); + mWifiStateFilter.addAction(WifiManager.RSSI_CHANGED_ACTION); + mWifiStateFilter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION); + + registerReceiver(mWifiStateReceiver, mWifiStateFilter); + + setContentView(R.layout.wifi_status_test); + + updateButton = (Button) findViewById(R.id.update); + updateButton.setOnClickListener(updateButtonHandler); + + mWifiState = (TextView) findViewById(R.id.wifi_state); + mNetworkState = (TextView) findViewById(R.id.network_state); + mSupplicantState = (TextView) findViewById(R.id.supplicant_state); + mRSSI = (TextView) findViewById(R.id.rssi); + mBSSID = (TextView) findViewById(R.id.bssid); + mSSID = (TextView) findViewById(R.id.ssid); + mHiddenSSID = (TextView) findViewById(R.id.hidden_ssid); + mIPAddr = (TextView) findViewById(R.id.ipaddr); + mMACAddr = (TextView) findViewById(R.id.macaddr); + mNetworkId = (TextView) findViewById(R.id.networkid); + mLinkSpeed = (TextView) findViewById(R.id.link_speed); + mScanList = (TextView) findViewById(R.id.scan_list); + + + mPingIpAddr = (TextView) findViewById(R.id.pingIpAddr); + mPingHostname = (TextView) findViewById(R.id.pingHostname); + mHttpClientTest = (TextView) findViewById(R.id.httpClientTest); + + pingTestButton = (Button) findViewById(R.id.ping_test); + pingTestButton.setOnClickListener(mPingButtonHandler); + } + + @Override + protected void onResume() { + super.onResume(); + registerReceiver(mWifiStateReceiver, mWifiStateFilter); + } + + @Override + protected void onPause() { + super.onPause(); + unregisterReceiver(mWifiStateReceiver); + } + + OnClickListener mPingButtonHandler = new OnClickListener() { + public void onClick(View v) { + updatePingState(); + } + }; + + OnClickListener updateButtonHandler = new OnClickListener() { + public void onClick(View v) { + final WifiInfo wifiInfo = mWifiManager.getConnectionInfo(); + + setWifiStateText(mWifiManager.getWifiState()); + mBSSID.setText(wifiInfo.getBSSID()); + mHiddenSSID.setText(String.valueOf(wifiInfo.getHiddenSSID())); + int ipAddr = wifiInfo.getIpAddress(); + StringBuffer ipBuf = new StringBuffer(); + ipBuf.append(ipAddr & 0xff).append('.'). + append((ipAddr >>>= 8) & 0xff).append('.'). + append((ipAddr >>>= 8) & 0xff).append('.'). + append((ipAddr >>>= 8) & 0xff); + + mIPAddr.setText(ipBuf); + mLinkSpeed.setText(String.valueOf(wifiInfo.getLinkSpeed())+" Mbps"); + mMACAddr.setText(wifiInfo.getMacAddress()); + mNetworkId.setText(String.valueOf(wifiInfo.getNetworkId())); + mRSSI.setText(String.valueOf(wifiInfo.getRssi())); + mSSID.setText(wifiInfo.getSSID()); + + SupplicantState supplicantState = wifiInfo.getSupplicantState(); + setSupplicantStateText(supplicantState); + } + }; + + private void setSupplicantStateText(SupplicantState supplicantState) { + if(SupplicantState.FOUR_WAY_HANDSHAKE.equals(supplicantState)) { + mSupplicantState.setText("FOUR WAY HANDSHAKE"); + } else if(SupplicantState.ASSOCIATED.equals(supplicantState)) { + mSupplicantState.setText("ASSOCIATED"); + } else if(SupplicantState.ASSOCIATING.equals(supplicantState)) { + mSupplicantState.setText("ASSOCIATING"); + } else if(SupplicantState.COMPLETED.equals(supplicantState)) { + mSupplicantState.setText("COMPLETED"); + } else if(SupplicantState.DISCONNECTED.equals(supplicantState)) { + mSupplicantState.setText("DISCONNECTED"); + } else if(SupplicantState.DORMANT.equals(supplicantState)) { + mSupplicantState.setText("DORMANT"); + } else if(SupplicantState.GROUP_HANDSHAKE.equals(supplicantState)) { + mSupplicantState.setText("GROUP HANDSHAKE"); + } else if(SupplicantState.INACTIVE.equals(supplicantState)) { + mSupplicantState.setText("INACTIVE"); + } else if(SupplicantState.INVALID.equals(supplicantState)) { + mSupplicantState.setText("INVALID"); + } else if(SupplicantState.SCANNING.equals(supplicantState)) { + mSupplicantState.setText("SCANNING"); + } else if(SupplicantState.UNINITIALIZED.equals(supplicantState)) { + mSupplicantState.setText("UNINITIALIZED"); + } else { + mSupplicantState.setText("BAD"); + Log.e(TAG, "supplicant state is bad"); + } + } + + private void setWifiStateText(int wifiState) { + String wifiStateString; + switch(wifiState) { + case WifiManager.WIFI_STATE_DISABLING: + wifiStateString = getString(R.string.wifi_state_disabling); + break; + case WifiManager.WIFI_STATE_DISABLED: + wifiStateString = getString(R.string.wifi_state_disabled); + break; + case WifiManager.WIFI_STATE_ENABLING: + wifiStateString = getString(R.string.wifi_state_enabling); + break; + case WifiManager.WIFI_STATE_ENABLED: + wifiStateString = getString(R.string.wifi_state_enabled); + break; + case WifiManager.WIFI_STATE_UNKNOWN: + wifiStateString = getString(R.string.wifi_state_unknown); + break; + default: + wifiStateString = "BAD"; + Log.e(TAG, "wifi state is bad"); + break; + } + + mWifiState.setText(wifiStateString); + } + + private void handleSignalChanged(int rssi) { + mRSSI.setText(String.valueOf(rssi)); + } + + private void handleWifiStateChanged(int wifiState) { + setWifiStateText(wifiState); + } + + private void handleScanResultsAvailable() { + List<ScanResult> list = mWifiManager.getScanResults(); + + StringBuffer scanList = new StringBuffer(); + if (list != null) { + for (int i = list.size() - 1; i >= 0; i--) { + final ScanResult scanResult = list.get(i); + + if (scanResult == null) { + continue; + } + + if (TextUtils.isEmpty(scanResult.SSID)) { + continue; + } + + scanList.append(scanResult.SSID+" "); + } + } + mScanList.setText(scanList); + } + + private void handleSupplicantStateChanged(SupplicantState state, boolean hasError, int error) { + if (hasError) { + mSupplicantState.setText("ERROR AUTHENTICATING"); + } else { + setSupplicantStateText(state); + } + } + + private void handleNetworkStateChanged(NetworkInfo networkInfo) { + if (mWifiManager.isWifiEnabled()) { + String summary = Summary.get(this, mWifiManager.getConnectionInfo().getSSID(), + networkInfo.getDetailedState()); + mNetworkState.setText(summary); + } + } + + private final void updatePingState() { + final Handler handler = new Handler(); + // Set all to unknown since the threads will take a few secs to update. + mPingIpAddrResult = getResources().getString(R.string.radioInfo_unknown); + mPingHostnameResult = getResources().getString(R.string.radioInfo_unknown); + mHttpClientTestResult = getResources().getString(R.string.radioInfo_unknown); + + mPingIpAddr.setText(mPingIpAddrResult); + mPingHostname.setText(mPingHostnameResult); + mHttpClientTest.setText(mHttpClientTestResult); + + final Runnable updatePingResults = new Runnable() { + public void run() { + mPingIpAddr.setText(mPingIpAddrResult); + mPingHostname.setText(mPingHostnameResult); + mHttpClientTest.setText(mHttpClientTestResult); + } + }; + Thread ipAddrThread = new Thread() { + @Override + public void run() { + pingIpAddr(); + handler.post(updatePingResults); + } + }; + ipAddrThread.start(); + + Thread hostnameThread = new Thread() { + @Override + public void run() { + pingHostname(); + handler.post(updatePingResults); + } + }; + hostnameThread.start(); + + Thread httpClientThread = new Thread() { + @Override + public void run() { + httpClientTest(); + handler.post(updatePingResults); + } + }; + httpClientThread.start(); + } + + /** + * The ping functions have been borrowed from Radio diagnostic app to + * enable quick access on the wifi status screen + */ + private final void pingIpAddr() { + try { + // TODO: Hardcoded for now, make it UI configurable + String ipAddress = "74.125.47.104"; + Process p = Runtime.getRuntime().exec("ping -c 1 -w 100 " + ipAddress); + int status = p.waitFor(); + if (status == 0) { + mPingIpAddrResult = "Pass"; + } else { + mPingIpAddrResult = "Fail: IP addr not reachable"; + } + } catch (IOException e) { + mPingIpAddrResult = "Fail: IOException"; + } catch (InterruptedException e) { + mPingIpAddrResult = "Fail: InterruptedException"; + } + } + + private final void pingHostname() { + try { + // TODO: Hardcoded for now, make it UI configurable + Process p = Runtime.getRuntime().exec("ping -c 1 -w 100 www.google.com"); + int status = p.waitFor(); + if (status == 0) { + mPingHostnameResult = "Pass"; + } else { + mPingHostnameResult = "Fail: Host unreachable"; + } + } catch (UnknownHostException e) { + mPingHostnameResult = "Fail: Unknown Host"; + } catch (IOException e) { + mPingHostnameResult= "Fail: IOException"; + } catch (InterruptedException e) { + mPingHostnameResult = "Fail: InterruptedException"; + } + } + + private void httpClientTest() { + HttpClient client = new DefaultHttpClient(); + try { + // TODO: Hardcoded for now, make it UI configurable + HttpGet request = new HttpGet("http://www.google.com"); + HttpResponse response = client.execute(request); + if (response.getStatusLine().getStatusCode() == 200) { + mHttpClientTestResult = "Pass"; + } else { + mHttpClientTestResult = "Fail: Code: " + String.valueOf(response); + } + request.abort(); + } catch (IOException e) { + mHttpClientTestResult = "Fail: IOException"; + } + } + +} |