package hillfly.wifichat.activity;
import hillfly.wifichat.R;
import hillfly.wifichat.adapter.WifiapAdapter;
import hillfly.wifichat.broadcast.WifiapBroadcast;
import hillfly.wifichat.broadcast.WifiapBroadcast.NetWorkChangeListener;
import hillfly.wifichat.common.BaseActivity;
import hillfly.wifichat.common.BaseDialog;
import hillfly.wifichat.common.dialog.ConnWifiDialog;
import hillfly.wifichat.common.sql.SqlDBOperate;
import hillfly.wifichat.consts.WifiApConst;
import hillfly.wifichat.model.UserInfo;
import hillfly.wifichat.model.Users;
import hillfly.wifichat.util.DateUtils;
import hillfly.wifichat.util.Logger;
import hillfly.wifichat.util.SessionUtils;
import hillfly.wifichat.util.SharePreferenceUtils;
import hillfly.wifichat.util.TextUtils;
import hillfly.wifichat.util.WifiUtils;
import hillfly.wifichat.util.WifiUtils.WifiCipherType;
import java.util.ArrayList;
import java.util.List;
import android.content.DialogInterface;
import android.content.IntentFilter;
import android.content.SharedPreferences;
import android.net.wifi.ScanResult;
import android.net.wifi.WifiManager;
import android.os.AsyncTask;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.AbsListView;
import android.widget.AbsListView.OnScrollListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.TextView;
/**
* @fileName WifiapActivity.java
* @description 网络连接
* @author _Hill3
*/
public class WifiapActivity extends BaseActivity implements OnClickListener, NetWorkChangeListener,
OnScrollListener, OnItemClickListener {
private static final Logger logger = Logger.getLogger(WifiapActivity.class);
private String localIPaddress; // 本地WifiIP
private String serverIPaddres; // 热点IP
private ApHandler mHandler;
private SearchWifiThread mSearchWifiThread;
private ArrayList<ScanResult> mWifiList; // 符合条件的热点列表
private BaseDialog mHintDialog; // 提示窗口
private ConnWifiDialog mConnWifiDialog; // 连接热点窗口
private WifiapAdapter mWifiApAdapter;
private UserInfo mUserInfo; // 用户信息类实例
private SqlDBOperate mSqlDBOperate;// 数据库操作实例
private WifiapBroadcast mWifiapBroadcast;
private LinearLayout mLlApInfo;
private TextView mTvStatusInfo;
private TextView mTvApSSID;
private ListView mLvWifiList;
private Button mBtnBack;
private Button mBtnCreateAp;
private Button mBtnNext;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_wifiap);
initBroadcast(); // 注册广播
initViews();
initEvents();
initAction();
}
@Override
protected void onDestroy() {
unregisterReceiver(mWifiapBroadcast); // 撤销广播
mSearchWifiThread.stop();
mSearchWifiThread = null;
super.onDestroy();
}
/** 动态注册广播 */
public void initBroadcast() {
mWifiapBroadcast = new WifiapBroadcast(this);
IntentFilter filter = new IntentFilter();
filter.addAction(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION);
filter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION);
filter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION);
filter.setPriority(Integer.MAX_VALUE);
registerReceiver(mWifiapBroadcast, filter);
}
/** 初始化视图 获取控件对象 **/
protected void initViews() {
mLlApInfo = (LinearLayout) findViewById(R.id.wifiap_lv_create_ok);
mTvStatusInfo = (TextView) findViewById(R.id.wifiap_tv_wifistatus);
mTvApSSID = (TextView) findViewById(R.id.wifiap_tv_createap_ssid);
mLvWifiList = (ListView) findViewById(R.id.wifiap_lv_wifi);
mBtnBack = (Button) findViewById(R.id.wifiap_btn_back);
mBtnCreateAp = (Button) findViewById(R.id.wifiap_btn_createap);
mBtnNext = (Button) findViewById(R.id.wifiap_btn_next);
}
/** 初始化全局设置 **/
@Override
protected void initEvents() {
mWifiList = new ArrayList<ScanResult>();
mWifiApAdapter = new WifiapAdapter(this, mWifiList);
mLvWifiList.setAdapter(mWifiApAdapter);
hintDialogOnClick hintClick = new hintDialogOnClick();
mHintDialog = BaseDialog.getDialog(WifiapActivity.this, R.string.dialog_tips, "",
getString(R.string.btn_yes), hintClick, getString(R.string.btn_cancel), hintClick);
mHandler = new ApHandler();
mConnWifiDialog = new ConnWifiDialog(this, mHandler);
mSearchWifiThread = new SearchWifiThread(mHandler);
mLvWifiList.setOnScrollListener(this);
mLvWifiList.setOnItemClickListener(this);
mBtnCreateAp.setOnClickListener(this);
mBtnBack.setOnClickListener(this);
mBtnNext.setOnClickListener(this);
}
/** 初始化控件设置 **/
protected void initAction() {
if (!WifiUtils.isWifiConnect() && !WifiUtils.isWifiApEnabled()) { // 无开启热点无连接WIFI
WifiUtils.OpenWifi();
}
if (WifiUtils.isWifiConnect()) { // Wifi已连接
mTvStatusInfo.setText(getString(R.string.wifiap_text_wifi_connected)
+ WifiUtils.getSSID());
}
if (WifiUtils.isWifiApEnabled()) { // 已开启热点
if (WifiUtils.getApSSID().startsWith(WifiApConst.WIFI_AP_HEADER)) {
mTvStatusInfo.setText(getString(R.string.wifiap_text_ap_1));
mLvWifiList.setVisibility(View.GONE);
mLlApInfo.setVisibility(View.VISIBLE);
mTvApSSID.setText("SSID: " + WifiUtils.getApSSID());
mBtnCreateAp.setText(getString(R.string.wifiap_btn_closeap));
}
else {
WifiUtils.closeWifiAp();
WifiUtils.OpenWifi();
mTvStatusInfo.setText(getString(R.string.wifiap_text_wifi_1_0));
}
}
if (WifiUtils.isWifiEnabled() && !WifiUtils.isWifiConnect()) { // Wifi已开启,未连接
mTvStatusInfo.setText(getString(R.string.wifiap_text_wifi_1_0));
}
mSearchWifiThread.start();
}
private void getWifiList() {
mWifiList.clear();
WifiUtils.startScan();
List<ScanResult> scanResults = WifiUtils.getScanResults();
mWifiList.addAll(scanResults);
}
/**
* 获取Wifi热点名
*
* <p>
* BuildBRAND 系统定制商 ; BuildMODEL 版本
* </p>
*
* @return 返回 定制商+版本 (String类型),用于创建热点。
*/
public String getLocalHostName() {
String str1 = Build.BRAND;
String str2 = TextUtils.getRandomNumStr(3);
return str1 + "_" + str2;
}
public String getPhoneModel() {
String str1 = Build.BRAND;
String str2 = Build.MODEL;
str2 = str1 + "_" + str2;
return str2;
}
/**
* 刷新热点列表UI
*
* @param list
*/
public void refreshAdapter(List<ScanResult> list) {
mWifiApAdapter.setData(list);
mWifiApAdapter.notifyDataSetChanged();
}
/**
* 设置IP地址信息
*
* @param isClient
* 是否为客户端
*/
public void setIPaddress() {
if (WifiUtils.isWifiApEnabled()) {
serverIPaddres = localIPaddress = "192.168.43.1";
}
else {
localIPaddress = WifiUtils.getLocalIPAddress();
serverIPaddres = WifiUtils.getServerIPAddress();
}
logger.i("localIPaddress:" + localIPaddress + " serverIPaddres:" + serverIPaddres);
}
/**
* IP地址正确性验证
*
* @return boolean 返回是否为正确, 正确(true),不正确(false)
*/
private boolean isValidated() {
setIPaddress();
String nullIP = "0.0.0.0";
if (nullIP.equals(localIPaddress) || nullIP.equals(serverIPaddres)
|| localIPaddress == null || serverIPaddres == null) {
showShortToast(R.string.wifiap_toast_connectap_unavailable);
return false;
}
return true;
}
/** 执行登陆 **/
private void doLogin() {
if (!isValidated()) {
return;
}
putAsyncTask(new AsyncTask<Void, Void, Boolean>() {
@Override
protected void onPreExecute() {
super.onPreExecute();
showLoadingDialog(getString(R.string.wifiap_dialog_login_saveInfo));
}
@Override
protected Boolean doInBackground(Void... params) {
try {
mSqlDBOperate = new SqlDBOperate(mContext);
String IMEI = SessionUtils.getIMEI();
String nickname = SessionUtils.getNickname();
String gender = SessionUtils.getGender();
String constellation = SessionUtils.getConstellation();
String device = getPhoneModel();
int age = SessionUtils.getAge();
int avatar = SessionUtils.getAvatar();
int onlineStateInt = SessionUtils.getOnlineStateInt();
String logintime = DateUtils.getNowtime();
// 录入数据库
// 若数据库中有IMEI对应的用户记录,则更新此记录; 无则创建新用户
if ((mUserInfo = mSqlDBOperate.getUserInfoByIMEI(IMEI)) != null) {
mUserInfo.setIPAddr(localIPaddress);
mUserInfo.setAvater(avatar);
mUserInfo.setOnlineState(onlineStateInt);
mUserInfo.setName(nickname);
mUserInfo.setSex(gender);
mUserInfo.setAge(age);
mUserInfo.setDevice(device);
mUserInfo.setConstellation(constellation);
mUserInfo.setLastDate(logintime);
mSqlDBOperate.updateUserInfo(mUserInfo);
}
else {
mUserInfo = new UserInfo(nickname, age, gender, IMEI, localIPaddress,
onlineStateInt, avatar);
mUserInfo.setLastDate(logintime);
mUserInfo.setDevice(device);
mUserInfo.setConstellation(constellation);
mSqlDBOperate.addUserInfo(mUserInfo);
}
int usserID = mSqlDBOperate.getIDByIMEI(IMEI); // 获取用户id
// 设置用户Session
SessionUtils.setLocalUserID(usserID);
SessionUtils.setDevice(device);
SessionUtils.setIsClient(!WifiUtils.isWifiApEnabled());
SessionUtils.setLocalIPaddress(localIPaddress);
SessionUtils.setServerIPaddress(serverIPaddres);
SessionUtils.setLoginTime(logintime);
// 在SD卡中存储登陆信息
SharePreferenceUtils mSPutUtils = new SharePreferenceUtils();
SharedPreferences.Editor mEditor = mSPutUtils.getEditor();
mEditor.putString(Users.IMEI, IMEI).putString(Users.DEVICE, device)
.putString(Users.NICKNAME, nickname).putString(Users.GENDER, gender)
.putInt(Users.AVATAR, avatar).putInt(Users.AGE, age)
.putString(Users.BIRTHDAY, SessionUtils.getBirthday())
.putInt(Users.ONLINESTATEINT, onlineStateInt)
.putString(Users.CONSTELLATION, constellation)
.putString(Users.LOGINTIME, logintime);
mEditor.commit();
return true;
}
catch (Exception e) {
e.printStackTrace();
}
finally {
if (null != mSqlDBOperate) {
mSqlDBOperate.close();
mSqlDBOperate = null;
}
}
return false;
}
@Override
protected void onPostExecute(Boolean result) {
super.onPostExecute(result);
dismissLoadingDialog();
if (result) {
startActivity(MainTabActivity.class);
finish();
}
else {
showShortToast("操作失败,请检查网络是否正常。");
}
}
});
}
/** 监听 主体界面按钮 **/
@Override
public void onClick(View v) {
switch (v.getId()) {
// 创建热点
case R.id.wifiap_btn_createap:
// 如果不支持热点创建
if (WifiUtils.getWifiApStateInt() == 4) {
showShortToast(R.string.wifiap_dialog_createap_nonsupport);
return;
}
// 如果wifi正打开着的,就提醒用户
if (WifiUtils.isWifiEnabled()) {
mHintDialog
.setMessage(getString(R.string.wifiap_dialog_createap_closewifi_confirm));
mHintDialog.show();
return;
}
// 如果存在一个共享热点
if (((WifiUtils.getWifiApStateInt() == 3) || (WifiUtils.getWifiApStateInt() == 13))
&& (WifiUtils.getApSSID().startsWith(WifiApConst.WIFI_AP_HEADER))) {
mHintDialog.setMessage(getString(R.string.wifiap_dialog_closeap_confirm));
mHintDialog.show();
return;
}
mHintDialog
.setMessage(getString(R.string.wifiap_dialog_createap_closewifi_confirm));
mHintDialog.show();
return;
// 返回按钮
case R.id.wifiap_btn_back:
if (mHintDialog.isShowing()) {
mHintDialog.dismiss();
}
finish();
break;
// 下一步按钮
case R.id.wifiap_btn_next:
if (mHintDialog.isShowing()) {
mHintDialog.dismiss();
}
doLogin();
break;
}
}
private class ApHandler extends Handler {
private boolean isRespond = true;
public ApHandler() {
}
public void setRespondFlag(boolean flag) {
isRespond = flag;
}
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case WifiApConst.ApScanResult: // 扫描Wifi列表
if (isRespond) {
getWifiList();
refreshAdapter(mWifiList);
}
break;
case WifiApConst.ApCreateApSuccess: // 创建热点成功
mSearchWifiThread.stop();
mTvStatusInfo.setText(getString(R.string.wifiap_text_createap_succeed));
mLvWifiList.setVisibility(View.GONE);
mLlApInfo.setVisibility(View.VISIBLE);
mTvApSSID.setText("SSID: " + WifiUtils.getApSSID());
mBtnCreateAp.setText(getString(R.string.wifiap_btn_closeap));
mBtnBack.setClickable(true);
mBtnCreateAp.setClickable(true);
mBtnNext.setClickable(true);
break;
case WifiApConst.WiFiConnectSuccess: // 连接热点成功
String str = getString(R.string.wifiap_text_wifi_connected)
+ WifiUtils.getSSID();
mTvStatusInfo.setText(str);
showShortToast(str);
break;
case WifiApConst.WiFiConnectError: // 连接热点错误
showShortToast(R.string.wifiap_toast_connectap_error);
break;
case WifiApConst.NetworkChanged: // Wifi状态变化
if (WifiUtils.isWifiEnabled()) {
mTvStatusInfo.setText(getString(R.string.wifiap_text_wifi_1_0));
}
else {
mTvStatusInfo.setText(getString(R.string.wifiap_text_wifi_0));
showShortToast(R.string.wifiap_text_wifi_disconnect);
}
default:
break;
}
}
}
/**
* 定时刷新Wifi列表信息
*/
class SearchWifiThread implements Runnable {
private boolean running = false;
private Thread thread = null;
private Handler handler = null;
SearchWifiThread(Handler handler) {
this.handler = handler;
}
public void run() {
while (!WifiUtils.isWifiApEnabled()) {
if (!this.running)
return;
try {
Thread.sleep(2000); // 扫描间隔
}
catch (InterruptedException e) {
e.printStackTrace();
}
handler.sendEmptyMessage(WifiApConst.ApScanResult);
}
}
public void start() {
try {
this.thread = new Thread(this);
this.running = true;
this.thread.start();
}
finally {
}
}
public void stop() {
try {
this.running = false;
this.thread = null;
}
finally {
}
}
}
@Override
public void WifiConnected() {
mHandler.sendEmptyMessage(WifiApConst.WiFiConnectSuccess);
}
@Override
public void wifiStatusChange() {
mHandler.sendEmptyMessage(WifiApConst.NetworkChanged);
}
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
switch (scrollState) {
case OnScrollListener.SCROLL_STATE_IDLE:
mHandler.setRespondFlag(true);
break;
case OnScrollListener.SCROLL_STATE_FLING:
mHandler.setRespondFlag(false); // 滚动时不刷新列表
break;
case OnScrollListener.SCROLL_STATE_TOUCH_SCROLL:
mHandler.setRespondFlag(false); // 滚动时不刷新列表
break;
}
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount,
int totalItemCount) {
}
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
ScanResult ap = mWifiList.get(position);
if (ap.SSID.startsWith(WifiApConst.WIFI_AP_HEADER)) {
mTvStatusInfo.setText(getString(R.string.wifiap_btn_connecting) + ap.SSID);
// 连接网络
boolean connFlag = WifiUtils.connectWifi(ap.SSID, WifiApConst.WIFI_AP_PASSWORD,
WifiCipherType.WIFICIPHER_WPA);
if (!connFlag) {
mTvStatusInfo.setText(getString(R.string.wifiap_toast_connectap_error_1));
mHandler.sendEmptyMessage(WifiApConst.WiFiConnectError);
}
}
else if (!WifiUtils.isWifiConnect() || !ap.BSSID.equals(WifiUtils.getBSSID())) {
mConnWifiDialog.setTitle(ap.SSID);
mConnWifiDialog.setScanResult(ap);
mConnWifiDialog.show();
}
}
public class hintDialogOnClick implements DialogInterface.OnClickListener {
@Override
public void onClick(DialogInterface hintDialog, int which) {
switch (which) {
// 确定
case 0:
hintDialog.dismiss();
if (WifiUtils.isWifiApEnabled()) {
// 执行关闭热点事件
WifiUtils.closeWifiAp();
WifiUtils.OpenWifi();
showShortToast(R.string.wifiap_text_ap_0);
mTvStatusInfo.setText(getString(R.string.wifiap_text_wifi_1_0));
mBtnCreateAp.setText(getString(R.string.wifiap_btn_createap));
mLlApInfo.setVisibility(View.GONE);
mLvWifiList.setVisibility(View.VISIBLE);
localIPaddress = null;
serverIPaddres = null;
mSearchWifiThread.start();
}
else {
// 创建热点
mTvStatusInfo.setText(getString(R.string.wifiap_text_createap_creating));
mBtnBack.setClickable(false);
mBtnCreateAp.setClickable(false);
mBtnNext.setClickable(false);
WifiUtils.startWifiAp(WifiApConst.WIFI_AP_HEADER + getLocalHostName(),
WifiApConst.WIFI_AP_PASSWORD, mHandler);
}
break;
// 取消
case 1:
hintDialog.cancel();
break;
}
}
}
}