import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.net.InetAddress;
import java.util.ArrayList;
import java.util.List;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.DialogInterface;
import android.content.IntentFilter;
import android.net.wifi.ScanResult;
import android.net.wifi.WifiConfiguration;
import android.net.wifi.WifiManager;
import android.net.wifi.p2p.WifiP2pManager;
import android.net.wifi.p2p.WifiP2pManager.Channel;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.ListView;
import android.widget.Toast;

public class WifiActivity extends Activity implements OnClickListener{
protected static final String TAG = "WifiActivity";

public final static String KEY_WIFI_PRIORITY = "wifi_priority";
public final static String KEY_WIFI_STATIC_IP = "wifi_static_ip";

WifiP2pManager mManager;
Channel mChannel;
BroadcastReceiver mReceiver;
IntentFilter mIntentFilter;
private WifiManager mWifiManager;
private List<ScanResult> mListResult;
private WifiAdapter mWifiAdapter;
private ListView mList;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.wifi_list);
ImageButton btn = (ImageButton)findViewById(R.id.back);
btn.setOnClickListener(this);
mList = (ListView)findViewById(R.id.list_view);
mReceiver = new WifiReceiver(new WifiScanListener() {

@Override
public void suppStateChange() {

}

@Override
public void stateChange() {

}

@Override
public void endScan() {
endScanWifi(mWifiManager.getScanResults()); 
}
});

mIntentFilter = new IntentFilter();

mIntentFilter.addAction("android.net.wifi.WIFI_STATE_CHANGED");
mIntentFilter.addAction("android.net.wifi.SCAN_RESULTS");
mIntentFilter.addAction("android.net.wifi.supplicant.STATE_CHANGE");

mWifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE); 
mWifiManager.setWifiEnabled(true);
mWifiAdapter = new WifiAdapter(this, null);
mList.setAdapter(mWifiAdapter);

}

// void showLog(String msg) {
// new AlertDialog.Builder(this).setTitle(R.string.alert_dialog_prompt).setMessage(msg).show();
// }

void promptMessage(String msg) {
Toast.makeText(this, msg, Toast.LENGTH_LONG).show();
}

public void showEditWifi(final ScanResult sr){
LayoutInflater factory = LayoutInflater.from(this);
final View textEntryView = factory.inflate(R.layout.dialog_wifi_setting, null);
new AlertDialog.Builder(this).setIconAttribute(android.R.attr.dialogIcon).setTitle(sr.SSID).setView(textEntryView).setCancelable(false)
 .setPositiveButton(R.string.alert_dialog_ok, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
try {
EditText edtWifiPwd = (EditText) textEntryView.findViewById(R.id.edt_wifi_pwd);
EditText edtStaticIp = (EditText) textEntryView.findViewById(R.id.edt_static_ip);
EditText edtStaticGateway = (EditText) textEntryView.findViewById(R.id.edt_static_gateway);
EditText edtStaticNetmask = (EditText) textEntryView.findViewById(R.id.edt_static_netmask);
EditText edtStaticDns = (EditText) textEntryView.findViewById(R.id.edt_static_dns);

String wifiPwd = edtWifiPwd.getText().toString().trim();
String ip = edtStaticIp.getText().toString().trim();
String gateway = edtStaticGateway.getText().toString().trim();
String prefixLength = edtStaticNetmask.getText().toString().trim();
String dns = edtStaticDns.getText().toString().trim();

saveStaticWifiConfig(sr,wifiPwd,ip,Integer.parseInt(prefixLength));
}catch (IllegalArgumentException e) {
promptMessage(getString(R.string.system_wifi_ip_error));
} catch (Exception e) {
e.printStackTrace();
promptMessage(getString(R.string.system_wifi_setting_error));
}
}
}).setNegativeButton(R.string.alert_dialog_cancel, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
dialog.cancel();
}
}).create().show();

try {
WifiConfiguration historyWifiConfig = getHistoryWifiConfig(sr.SSID);
EditText edtWifiPwd = (EditText) textEntryView.findViewById(R.id.edt_wifi_pwd);
EditText edtStaticIp = (EditText) textEntryView.findViewById(R.id.edt_static_ip);
EditText edtStaticGateway = (EditText) textEntryView.findViewById(R.id.edt_static_gateway);
EditText edtStaticNetmask = (EditText) textEntryView.findViewById(R.id.edt_static_netmask);
EditText edtStaticDns = (EditText) textEntryView.findViewById(R.id.edt_static_dns);

if(historyWifiConfig != null){ 
InetAddress address = getIpAddress(historyWifiConfig);
if(address != null){
edtStaticIp.setText(address.getHostAddress());
address = null;
}
address = getGateway(historyWifiConfig);
if(address != null){
edtStaticGateway.setText(address.getHostAddress());
address = null;
}
address = getDNS(historyWifiConfig);
if(address != null){
edtStaticDns.setText(address.getHostAddress());
address = null;
}
edtStaticNetmask.setText(getNetworkPrefixLength(historyWifiConfig)); 

}

if(TextUtils.isEmpty(edtStaticIp.getText().toString().trim())){
String ipString = SmartHomePreference.getStringProperty(KEY_WIFI_STATIC_IP);
int intIp = inetAddressToInt(InetAddress.getByName(ipString)); 
String dns = (intIp & 0xFF ) + "." + ((intIp >> 8 ) & 0xFF) + "." + ((intIp >> 16 ) & 0xFF) + ".1";

edtStaticIp.setText(ipString);
edtStaticNetmask.setText("24");
edtStaticGateway.setText(dns);
edtStaticDns.setText(dns); 
}
} catch (Exception e) {
e.printStackTrace();
}

}

/**
* 设置wifi,编辑静态IP
* @param sr
* @param pwd
* @param ip
* @throws Exception
*/
public void saveStaticWifiConfig(final ScanResult sr,String pwd, String ip,int networkPrefixLength) throws Exception{ 
InetAddress intetAddress = InetAddress.getByName(ip);
int intIp = inetAddressToInt(intetAddress); 
WifiConfiguration historyWifiConfig = getHistoryWifiConfig(sr.SSID); 
if(historyWifiConfig == null){
historyWifiConfig = createComWifiConfig(sr.SSID,pwd); 
}else{
if(!TextUtils.isEmpty(pwd)){
historyWifiConfig.preSharedKey = "\""+ pwd + "\""; 
}
}

String dns = (intIp & 0xFF ) + "." + ((intIp >> 8 ) & 0xFF) + "." + ((intIp >> 16 ) & 0xFF) + ".1";
setIpAssignment("STATIC", historyWifiConfig); //"STATIC" or "DHCP" for dynamic setting
setIpAddress(intetAddress, networkPrefixLength, historyWifiConfig);
setGateway(InetAddress.getByName(dns), historyWifiConfig);
setDNS(InetAddress.getByName(dns), historyWifiConfig); 

mWifiManager.removeNetwork(historyWifiConfig.networkId);
int netId = mWifiManager.addNetwork(historyWifiConfig);
mWifiManager.enableNetwork(netId, true);
mWifiManager.updateNetwork(historyWifiConfig); //apply the setting
SmartHomePreference.setProperty(WifiActivity.KEY_WIFI_PRIORITY, sr.SSID);

mWifiManager.startScan();
}


/***
* Convert a IPv4 address from an InetAddress to an integer
* @param inetAddr is an InetAddress corresponding to the IPv4 address
* @return the IP address as an integer in network byte order
*/
public static int inetAddressToInt(InetAddress inetAddr)
throws IllegalArgumentException {
byte [] addr = inetAddr.getAddress();
if (addr.length != 4) {
throw new IllegalArgumentException("Not an IPv4 address");
}
return ((addr[3] & 0xff) << 24) | ((addr[2] & 0xff) << 16) |
((addr[1] & 0xff) << 8) | (addr[0] & 0xff);
}

public void editStaticWifiConfig(final ScanResult sr,String pwd, String ip, String gateway,int prefixLength,String dns) throws Exception{ 
WifiConfiguration historyWifiConfig = getHistoryWifiConfig(sr.SSID);

if(historyWifiConfig == null){
historyWifiConfig = createComWifiConfig(sr.SSID,pwd);
int netId = mWifiManager.addNetwork(historyWifiConfig);
mWifiManager.enableNetwork(netId, true);
}

setIpAssignment("STATIC", historyWifiConfig); //"STATIC" or "DHCP" for dynamic setting
setIpAddress(InetAddress.getByName(ip), prefixLength, historyWifiConfig);
setGateway(InetAddress.getByName(gateway), historyWifiConfig);
setDNS(InetAddress.getByName(dns), historyWifiConfig);

mWifiManager.updateNetwork(historyWifiConfig); //apply the setting
}

public void editDhcpWifiConfig(final ScanResult sr,String pwd) throws Exception{ 
WifiConfiguration historyWifiConfig = getHistoryWifiConfig(sr.SSID);

if(historyWifiConfig == null){
historyWifiConfig = createComWifiConfig(sr.SSID,pwd);
int netId = mWifiManager.addNetwork(historyWifiConfig);
mWifiManager.enableNetwork(netId, true);
}

setIpAssignment("DHCP", historyWifiConfig); //"STATIC" or "DHCP" for dynamic setting

mWifiManager.updateNetwork(historyWifiConfig); //apply the setting
}

/**
* 新建wifi配置项
* @param ssid
* @param pwd
* @return
*/
public WifiConfiguration createComWifiConfig(String ssid,String pwd){
WifiConfiguration wc = new WifiConfiguration();
wc.SSID = "\"" + ssid + "\""; //配置wifi的SSID,即该热点的名称,如:TP-link_xxx
wc.preSharedKey = "\""+ pwd + "\""; //该热点的密码
wc.hiddenSSID = true;
wc.status = WifiConfiguration.Status.ENABLED;
wc.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);
wc.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);
wc.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);
wc.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP);
wc.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP);
wc.allowedProtocols.set(WifiConfiguration.Protocol.RSN);
return wc;
}

/**
* 查找已经设置好的Wifi
* @param ssid
* @return
*/
public WifiConfiguration getHistoryWifiConfig(String ssid){
List<WifiConfiguration> localList = mWifiManager.getConfiguredNetworks();
for(WifiConfiguration wc : localList){
if(("\"" + ssid + "\"").equals(wc.SSID)){
return wc;
}
mWifiManager.disableNetwork(wc.networkId);
}
return null;
}

public static void setIpAssignment(String assign, WifiConfiguration wifiConf)throws SecurityException, IllegalArgumentException,NoSuchFieldException, IllegalAccessException {
setEnumField(wifiConf, assign, "ipAssignment");
}

public static void setIpAddress(InetAddress addr, int prefixLength,WifiConfiguration wifiConf) throws SecurityException,IllegalArgumentException,
NoSuchFieldException,IllegalAccessException, NoSuchMethodException,ClassNotFoundException, InstantiationException,InvocationTargetException {
Object linkProperties = getField(wifiConf, "linkProperties");
if (linkProperties == null)
return;
Class laClass = Class.forName("android.net.LinkAddress");
Constructor laConstructor = laClass.getConstructor(new Class[] {InetAddress.class, int.class });
Object linkAddress = laConstructor.newInstance(addr, prefixLength);
ArrayList mLinkAddresses = (ArrayList) getDeclaredField(linkProperties,"mLinkAddresses");
mLinkAddresses.clear();
mLinkAddresses.add(linkAddress);
}

public static void setGateway(InetAddress gateway,WifiConfiguration wifiConf) throws SecurityException,IllegalArgumentException,
NoSuchFieldException,IllegalAccessException, ClassNotFoundException,NoSuchMethodException, InstantiationException,InvocationTargetException {
Object linkProperties = getField(wifiConf, "linkProperties");
if (linkProperties == null)
return;
Class routeInfoClass = Class.forName("android.net.RouteInfo");
Constructor routeInfoConstructor = routeInfoClass.getConstructor(new Class[] { InetAddress.class });
Object routeInfo = routeInfoConstructor.newInstance(gateway);
ArrayList mRoutes = (ArrayList) getDeclaredField(linkProperties,"mRoutes");
mRoutes.clear();
mRoutes.add(routeInfo);
}

public static void setDNS(InetAddress dns, WifiConfiguration wifiConf) throws SecurityException, IllegalArgumentException,NoSuchFieldException, IllegalAccessException {
Object linkProperties = getField(wifiConf, "linkProperties");
if (linkProperties == null)
return;
ArrayList<InetAddress> mDnses = (ArrayList<InetAddress>) getDeclaredField(linkProperties, "mDnses");
mDnses.clear(); // or add a new dns address , here I just want to replace DNS1
mDnses.add(dns);
}

public static String getNetworkPrefixLength(WifiConfiguration wifiConf) {
String address = "";
try {
Object linkProperties = getField(wifiConf, "linkProperties");
if (linkProperties == null)
return null;

if (linkProperties != null){
ArrayList mLinkAddresses = (ArrayList) getDeclaredField(linkProperties,"mLinkAddresses");
if(mLinkAddresses != null && mLinkAddresses.size() > 0){
Object linkAddressObj = mLinkAddresses.get(0);
address = linkAddressObj.getClass().getMethod("getNetworkPrefixLength", new Class[]{}).invoke(linkAddressObj,null) + "";
}
}

} catch (Exception e) {
e.printStackTrace();
}
return address;
}

public static InetAddress getIpAddress(WifiConfiguration wifiConf) {
InetAddress address = null;
try {
Object linkProperties = getField(wifiConf, "linkProperties");
if (linkProperties == null)
return null;

if (linkProperties != null){
ArrayList mLinkAddresses = (ArrayList) getDeclaredField(linkProperties,"mLinkAddresses");
if(mLinkAddresses != null && mLinkAddresses.size() > 0){
Object linkAddressObj = mLinkAddresses.get(0);
address = (InetAddress)linkAddressObj.getClass().getMethod("getAddress", new Class[]{}).invoke(linkAddressObj,null);
}
}

} catch (Exception e) {
e.printStackTrace();
}
return address;
}

public static InetAddress getGateway(WifiConfiguration wifiConf) {
InetAddress address = null;
try {
Object linkProperties = getField(wifiConf, "linkProperties");

if (linkProperties != null){
ArrayList mRoutes = (ArrayList) getDeclaredField(linkProperties,"mRoutes");
if(mRoutes != null && mRoutes.size() > 0){
Object linkAddressObj = mRoutes.get(0);
address = (InetAddress)linkAddressObj.getClass().getMethod("getGateway", new Class[]{}).invoke(linkAddressObj,null);
}
}
} catch (Exception e) {
e.printStackTrace();
}
return address;
}

public static InetAddress getDNS(WifiConfiguration wifiConf) {
InetAddress address = null;
try {
Object linkProperties = getField(wifiConf, "linkProperties");

if (linkProperties != null){
ArrayList<InetAddress> mDnses = (ArrayList<InetAddress>) getDeclaredField(linkProperties, "mDnses");
if(mDnses != null && mDnses.size() > 0){
address = (InetAddress)mDnses.get(0); 
}
} 
} catch (Exception e) {
e.printStackTrace();
}

return address;
}

public static Object getField(Object obj, String name) throws SecurityException, NoSuchFieldException,IllegalArgumentException, IllegalAccessException {
Field f = obj.getClass().getField(name);
Object out = f.get(obj);
return out;
}

public static Object getDeclaredField(Object obj, String name) throws SecurityException, NoSuchFieldException,IllegalArgumentException, IllegalAccessException {
Field f = obj.getClass().getDeclaredField(name);
f.setAccessible(true);
Object out = f.get(obj);
return out;
}

public static void setEnumField(Object obj, String value, String name) throws SecurityException, NoSuchFieldException,
IllegalArgumentException, IllegalAccessException {
Field f = obj.getClass().getField(name);
f.set(obj, Enum.valueOf((Class<Enum>) f.getType(), value));
}


@Override
protected void onResume() {
super.onResume();
registerReceiver(mReceiver, mIntentFilter);
if(mWifiManager != null) mWifiManager.startScan();
}

@Override
protected void onPause() {
super.onPause();
unregisterReceiver(mReceiver); 
}

@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.back:
// if(mWifiManager != null) mWifiManager.startScan();
finish();
break;

default:
break;
}
}

public void endScanWifi(final List<ScanResult> list){
runOnUiThread(new Runnable() { 
@Override
public void run() {
if(mWifiAdapter != null){
mWifiAdapter.setList(list);
mWifiAdapter.notifyDataSetChanged();
} 
}
});

}
}

arrow
arrow
    全站熱搜

    戮克 發表在 痞客邦 留言(0) 人氣()