package com.zone.lib.utils.system_hardware_software_receiver_shell.software.wifi;

import java.lang.reflect.Method;
import java.util.List;

import android.annotation.SuppressLint;
import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.net.wifi.ScanResult;
import android.net.wifi.WifiConfiguration;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
import android.net.wifi.WifiManager.WifiLock;

/**
 * 所有有关wifi与3G的类已经加载完毕  
 * <br>为完成  wifi SSID重复问题  当遇到问题在修改
 * <br> private 没有 get 用到再说吧  mWifiConfiguration mNetWorkInfo OK了
 * @author Zone
 *
 */
public class MyWifiAnd3G {
	
	// 管理连接
	private ConnectivityManager mConnectivityManager;
	private WifiManager mWifiManager;
	
	// 定义NetworkInfo、WifiInfo对象
	private NetworkInfo mNetWorkInfo;
	private WifiInfo mWifiInfo;

	// 扫描出的网络连接列表、网络连接列表
	private List<ScanResult> mWifiList;
	private List<WifiConfiguration> mWifiConfiguration;
	
	// 定义一个WifiLock
	private WifiLock mWifiLock;

	
	//	<!-- WIFI权限 -->
	//    <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
	//    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
	//    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
	//    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
	
	/**
	 * 添加wifi权限  进入lib里 可看到<br> 
	 * 初始化 配置 <br>
	 * @param context
	 */
	public MyWifiAnd3G(Context context) {
		//初始化 Manager
		mWifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
		mConnectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
		//初始化 当前的wifiInfo、netWorkInfo
		mWifiInfo = mWifiManager.getConnectionInfo();
		mNetWorkInfo=mConnectivityManager.getActiveNetworkInfo();
//		Log.e("查看的东西", "WifiManager信息是:"+mWifiManager.toString()+"\n"+"ConnectivityManager信息是:"+mConnectivityManager.toString()+"\n"+"WifiInfo信息是:"+mWifiInfo.toString()+"\n");
		
		
	}
	
	/**
	 * 得到配置好的网络
	 * 
	 * @return
	 */
	public List<WifiConfiguration> getConfiguration() {
		return mWifiManager.getConfiguredNetworks();
	}
	/**
	 * @return 当前的WifiInfo
	 */
	public WifiInfo getWifiInfo() {
		return mWifiManager.getConnectionInfo();
	}

	
	/**
	 * 打开或关闭当前3G网络
	 * 
	 * @param value
	 *            true 打开 false 关闭
	 * @return
	 * @throws Exception
	 */
	@SuppressWarnings({ "rawtypes", "unchecked" })
	public Object openOrClose3GNet(boolean value) {
		Class ownerClass = mConnectivityManager.getClass();
		Class[] argsClass = new Class[1];
		argsClass[0] = boolean.class;
		Method method;
		Object obj = null;
		try {
			method = ownerClass.getMethod("setMobileDataEnabled", argsClass);
			obj = method.invoke(mConnectivityManager, value);
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		return obj;
	}
	/**
	 * 
	 * @return  返回3gNet的状态
	 * @throws Exception
	 */
	public boolean state3GNet()  {
		Class<? extends ConnectivityManager> ownerClass = mConnectivityManager
				.getClass();
		boolean state = false;
		try {
			Method method = ownerClass.getMethod("getMobileDataEnabled");
			state = (Boolean) method.invoke(mConnectivityManager);
		} catch (Exception e) {
			e.printStackTrace();
		} 
		return state;
	}

	/**
	 * 判断当前WIFI是否处于打开状态
	 * 
	 * @return
	 */
	public boolean isWiFiActive() {
		return mWifiManager.isWifiEnabled();
	}
	/**
	 * 返回当前Wifi状态
	 * 
	 * @return
	 */
	public int checkState() {
		// WIFI_STATE_DISABLED WIFI关闭
		// WIFI_STATE_DISABLING WIFI正在关闭
		// WIFI_STATE_ENABLED WIFI已打开
		// WIFI_STATE_ENABLING WIFI正在打开
		// WIFI_STATE_UNKNOWN WIFI状态未知
		return mWifiManager.getWifiState();
	}
	/**
	 * 打开Wifi
	 */
	public void openWifi() {
		if (!mWifiManager.isWifiEnabled()) {
			mWifiManager.setWifiEnabled(true);//false是关闭wifi true是打开wifi
			mWifiManager.isWifiEnabled();//wifi是开着的吗?
		}
	}

	/**
	 * 关闭Wifi
	 */
	public void closeWifi() {
		if (mWifiManager.isWifiEnabled()) {
			mWifiManager.setWifiEnabled(false);
		}
	}


	/**
	 * 判断手机当前是否联网
	 * 
	 * @return
	 */
	public boolean isNetwork() {
		if (mNetWorkInfo == null) {
			return false;
		}
			return mNetWorkInfo.isAvailable();
	}
	/**
	 * 判断手机当前网络类型  WifiOr3G
	 * 
	 * @return  0:无网络 1:3g 2:WIFI
	 */
	public int getNowConnectType() {
		if (mNetWorkInfo == null) {
			return 0;
		}else
		{
			if("WIFI".equals(mNetWorkInfo.getTypeName()))
			{
				return 2;
			}
		}
		return 1;
		
	}

	
	/**
	 *  连接指定的配置好的网络进行 
	 * 
	 * @param wcfg     WifiConfiguration(能在此类中get到)
	 * @param mostCount     最多连多少次
	 * @param sleepMs     每次睡多少毫秒
	 */
	public boolean connectConfiguration(WifiConfiguration wcfg,int mostCount,int sleepMs) {
		// 索引大于配置好的网络索引返回
		if (wcfg ==null) {
			System.err.println("WifiConfiguration wcfg为null!!!");
			return  false;
		}
		mWifiInfo=mWifiManager.getConnectionInfo();
		if (mWifiInfo != null && mWifiInfo.getNetworkId() == wcfg.networkId&&mWifiInfo.getLinkSpeed()>0) {
			// 不连接  有wifi并且当前wifi  是这个即将要连接的wifi
			System.out.println("当前连接的wifi 已经连接上 不必重复连接~~~");
			return  true;

		} else {
			// 连接配置好的指定ID的网络
			System.out.println("要连接的netid:\t" + wcfg.networkId);
			boolean connStatue= mWifiManager.enableNetwork(wcfg.networkId, true);
			boolean  resultStatue=false;
			if (connStatue) {
				// 当连接 wifi 成功的时候
				int i = 1;
				while (i <= mostCount) {
					try {
						if (getWifiInfo().getNetworkId() == wcfg.networkId
								&& WifiManager.WIFI_STATE_ENABLED == mWifiManager.getWifiState()) {
							resultStatue = true;
							System.out.println("wifi开启成功success!!!");
							break;
						}
						Thread.sleep(sleepMs);
						if (i == 1) {
							System.out.println("每次等待时间为:\t" + sleepMs + "\tms");
						}
						System.out.println("等待wifi完全开启  第" + i + "次");
						i++;
					} catch (InterruptedException e) {
						e.printStackTrace();
						System.err.println("Thread sleep发生异常");
					}
				}
				if (!resultStatue) {
					System.err.println("连接fail");
				}
			}
		
			return resultStatue;
		}
		
	}
	/**
	 * 断开当前网络
	 */
	public boolean disconnectWifi() {

		// 断开指定的 wifi连接
		// mWifiManager.disableNetwork(wcfg.networkId);
		// 断开当前wifi的连接 一个意思
		mWifiInfo=mWifiManager.getConnectionInfo();
		if (mWifiInfo == null) {
			System.out.println("当前没有网络连接 故不用断开~~~");
			return true;
		}
		return mWifiManager.disconnect();
	}
	/**
	 * 搜索网络
	 */
	public void startScan() {
		mWifiManager.startScan();
		// 得到扫描结果
		mWifiList = mWifiManager.getScanResults();
		// 得到配置好的网络连接
		mWifiConfiguration = mWifiManager.getConfiguredNetworks();
	}

	/**
	 * 查看扫描结果
	 * 
	 * @return
	 */
	@SuppressLint("UseValueOf")
	public StringBuilder lookUpScan() {
		StringBuilder stringBuilder = new StringBuilder();
		for (int i = 0; i < mWifiList.size(); i++) {
			stringBuilder
					.append("Index_" + new Integer(i + 1).toString() + ":");
			// 将ScanResult信息转换成一个字符串包
			stringBuilder.append((mWifiList.get(i)).toString());
			stringBuilder.append("/n");
		}
		return stringBuilder;
	}


	/**
	 * 
	 * @return  也是例如:ip解析后地址:192.168.60.104
	 */
	public String getIPAddress() {
		if (mWifiInfo == null) {
			return null;
		} else {
			//例如:得到IP地址 ip :1748805824
			int ip = mWifiInfo.getIpAddress();
			return ((ip & 0xff) + "." + (ip >> 8 & 0xff) + "."+ (ip >> 16 & 0xff) + "." + (ip >> 24 & 0xff));
		}
	}


	
	/**
	 * 锁定WifiLock
	 */
	public void acquireWifiLock() {
		mWifiLock.acquire();
	}

	/**
	 * 解锁WifiLock
	 */
	public void releaseWifiLock() {
		// 判断时候锁定
		if (mWifiLock.isHeld()) {
			mWifiLock.acquire();
		}
	}

	/**
	 * 创建一个WifiLock
	 */
	public void creatWifiLock() {
		mWifiLock = mWifiManager.createWifiLock("Test");
	}

	
	

}