package com.pandocloud.freeiot.ui.device.config;
import java.util.ArrayList;
import java.util.List;
import java.util.Timer;
import java.util.TimerTask;
import org.apache.http.Header;
import android.annotation.SuppressLint;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.IntentFilter;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.net.ConnectivityManager;
import android.net.NetworkInfo.State;
import android.net.wifi.ScanResult;
import android.net.wifi.WifiConfiguration;
import android.net.wifi.WifiManager;
import android.os.Bundle;
import android.os.Handler;
import android.os.PowerManager.WakeLock;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.support.v4.content.LocalBroadcastManager;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Filter;
import android.widget.Filterable;
import android.widget.ListView;
import android.widget.PopupWindow;
import android.widget.TextView;
import com.pandocloud.android.api.AbsOpenApi;
import com.pandocloud.android.config.wifi.WifiConfigManager;
import com.pandocloud.android.config.wifi.WifiConfigMessageHandler;
import com.pandocloud.android.utils.WifiConnectUtil;
import com.pandocloud.freeiot.R;
import com.pandocloud.freeiot.api.DevicesApi;
import com.pandocloud.freeiot.api.WrapperBaseJsonHttpResponseHandler;
import com.pandocloud.freeiot.ui.app.ActionConstants;
import com.pandocloud.freeiot.ui.app.UserState;
import com.pandocloud.freeiot.ui.base.EasyBaseAdapter;
import com.pandocloud.freeiot.ui.bean.http.BaseResponse;
import com.pandocloud.freeiot.utils.ActivityUtils;
import com.pandocloud.freeiot.utils.AnalyticsUtils;
import com.pandocloud.freeiot.utils.CommonUtils;
import com.pandocloud.freeiot.utils.DialogFactory;
import com.pandocloud.freeiot.utils.GsonUtils;
import com.pandocloud.freeiot.utils.LogUtils;
import com.pandocloud.freeiot.utils.UIUtils;
import com.pandocloud.freeiot.utils.WakeLockWrapper;
import com.umeng.analytics.MobclickAgent;
public class ApSsidConfigFragment extends Fragment implements OnClickListener {
private static final String TAG = "APSsidConfigFragment#blocker";
private EditText etSsid;
private EditText etPwd;
private Button btnConfig;
private SSIDAdapter adapter;
private List<ScanResult> scanResults;
private WifiManager wifiManager;
private WifiConnectUtil wifiConnectUtil;
private String ssid;
private String pwd; // wifi network pwd
private WifiConfigMessageHandler msgHandler;
private String deviceKey;
private Timer timer;
private int refreshTimeDex = 3000;
private WakeLock wakeLock;
@SuppressLint("HandlerLeak")
private Handler mHandler = new Handler(){
public void handleMessage(android.os.Message msg) {
switch (msg.what) {
case WifiConfigManager.CONFIG_SUCCESS:
if (getActivity() == null) {
return;
}
CommonUtils.showProgressDialog(getActivity(), "", getString(R.string.config_success));
String tokenValue = (String) msg.obj;
deviceKey = tokenValue;
bindDevice(deviceKey);
LogUtils.e(TAG, "config success...");
break;
case WifiConfigManager.CONFIG_FAILED:
LogUtils.e(TAG, "config failed...");
CommonUtils.dismissDialog();
CommonUtils.ToastMsg(getActivity(), R.string.config_failed);
break;
case WifiConfigManager.DEVICE_CONNECT_FAILED:
LogUtils.e(TAG, "socket connect failed...");
break;
case WifiConfigManager.DEVICE_SEND_FAILED:
LogUtils.e(TAG, "send msg failed...");
break;
default:
break;
}
};
};
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
wakeLock = WakeLockWrapper.getWakeLockInstance(getActivity(), getClass().getSimpleName());
wakeLock.acquire();
wifiManager = (WifiManager) getActivity().getSystemService(Context.WIFI_SERVICE);
wifiConnectUtil = new WifiConnectUtil(wifiManager);
getActivity().registerReceiver(ssidRefreshReceiver, new IntentFilter(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION));
}
@Override
public View onCreateView(LayoutInflater inflater,
@Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_gateway_config, container, false);
initView(rootView);
return rootView;
}
public void initView(View rootView) {
etSsid = (EditText) rootView.findViewById(R.id.et_ssid);
etPwd = (EditText) rootView.findViewById(R.id.et_pwd);
btnConfig = (Button) rootView.findViewById(R.id.btn_config);
btnConfig.setOnClickListener(this);
rootView.findViewById(R.id.back).setOnClickListener(this);
rootView.findViewById(R.id.btn_exit).setOnClickListener(this);
ssid = wifiConnectUtil.getCurrentWifiSSID(getClass().getSimpleName());
etSsid.setText(ssid);
}
public synchronized void bindDevice(String deviceKey) {
LogUtils.e(TAG, "deviceKey: " + deviceKey);
DevicesApi.deviceBind(getActivity(),
UserState.getInstances(getActivity()).getAccessToken(""),
deviceKey, new WrapperBaseJsonHttpResponseHandler<BaseResponse>(getActivity()) {
@Override
public void onStart() {
if (!CommonUtils.showingProgressDialog()) {
CommonUtils.showProgressDialog(getActivity(), null, null);
}
}
@Override
public void onFailure(int statusCode, Header[] headers,
Throwable throwable, String rawJsonData,
BaseResponse errorResponse) {
super.onFailure(statusCode, headers, throwable, rawJsonData, errorResponse);
}
@Override
public void onSuccess(int statusCode, Header[] headers,
String rawJsonData, BaseResponse response) {
if (response.isSuccess()) {
if (timer != null) {
timer.cancel();
timer = null;
}
LocalBroadcastManager.getInstance(getActivity()).sendBroadcast(new Intent(ActionConstants.ACTON_REFRESH_DEVICES));
MobclickAgent.onEventValue(getActivity(), AnalyticsUtils.AnalyticsEventKeys.EVENT_APCONFIG, null, (int) (System.currentTimeMillis() - GateWayConfigActivity.startConfigTime));
ActivityUtils.animFinish(getActivity(), R.anim.slide_in_from_left, R.anim.slide_out_to_right);
} else {
super.onSuccess(statusCode, headers, rawJsonData, response);
}
}
@Override
protected BaseResponse parseResponse2(String rawJsonData,
boolean isFailure) throws Throwable {
LogUtils.d("ApSsidConfigFragment# rawJsonData: " + rawJsonData);
if (!isFailure && !TextUtils.isEmpty(rawJsonData)) {
return GsonUtils.getInstance().getGson().fromJson(rawJsonData, BaseResponse.class);
}
return null;
}
@Override
public void onFinish() {
CommonUtils.dismissDialog();
}
});
}
@Override
public void onResume() {
super.onResume();
MobclickAgent.onPageStart(AnalyticsUtils.AnalyticsViewKeys.VIEW_APSSID_CONFIG_FGMENT);
}
@Override
public void onPause() {
super.onPause();
MobclickAgent.onPageEnd(AnalyticsUtils.AnalyticsViewKeys.VIEW_APSSID_CONFIG_FGMENT);
}
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
initData();
}
public void initData() {
msgHandler = new WifiConfigMessageHandler(mHandler);
if (wifiManager.getWifiState() == WifiManager.WIFI_STATE_DISABLED) {
openWifi();
} else {
refreshCurrentSSID();
}
}
public void openWifi() {
boolean openWifi = wifiConnectUtil.OpenWifi();
if (openWifi) {
refreshCurrentSSID();
}
}
private void refreshCurrentSSID() {
if (wifiManager.startScan()) {
if (adapter == null || adapter.isEmpty()) {
mHandler.post(new Runnable() {
@Override
public void run() {
refreshSSIDSpinner();
etSsid.requestFocus();
//TODO
// String currentWifiSSID = wifiConnectUtil.getCurrentWifiSSID("");
// if (!TextUtils.isEmpty(currentWifiSSID)) {
// autoCompleteTextView.setText(currentWifiSSID);
// }
}
});
}
}
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn_config:
pwd = etPwd.getText().toString().trim();
ssid = etSsid.getText().toString().trim();
if (TextUtils.isEmpty(ssid)) {
return;
}
if (TextUtils.isEmpty(pwd)) {
DialogFactory.createCommonDialog(getActivity(), getString(android.R.string.yes),
getString(R.string.wifi_no_pwd_tip, ssid),
getString(android.R.string.ok), getString(android.R.string.cancel),
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
CommonUtils.showProgressDialog(getActivity(), null, getString(R.string.configing));
connect();
refreshTimeDex = 5000;
}
}, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
}).show();
return;
} else {
CommonUtils.showProgressDialog(getActivity(), null, getString(R.string.configing));
connect();
refreshTimeDex = 5000;
}
break;
case R.id.back:
case R.id.btn_exit:
WifiConfigManager.stopConfig();
MobclickAgent.onEvent(getActivity(), AnalyticsUtils.AnalyticsEventKeys.EVENT_EXIT_CONFIG);
ActivityUtils.animFinish(getActivity(), R.anim.slide_in_from_left, R.anim.slide_out_to_right);
break;
default:
break;
}
}
public void connect() {
WifiConfigManager.setMsgHandler(msgHandler);
WifiConfigManager.startConfig(getActivity(), WifiConfigManager.CONFIG_MODE_SMARTLINK, ssid, pwd);
}
class WifiRefreshRunnable extends TimerTask {
@Override
public void run() {
mHandler.post(new Runnable() {
@Override
public void run() {
LogUtils.e(getClass().getSimpleName(), "WifiRefreshRunnable#run....");
String currentSSID = wifiConnectUtil.getCurrentWifiSSID(getClass().getSimpleName());
if (!currentSSID.equals(ssid) && TextUtils.isEmpty(deviceKey)) {
wifiConnectUtil.Connect(ssid, pwd, WifiConnectUtil.WifiCipherType.WIFICIPHER_WPA);
}
}
});
}
}
class SSIDAdapter extends EasyBaseAdapter<ScanResult> implements Filterable {
public SSIDAdapter(Context context, List<ScanResult> dataset) {
super(context, dataset);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
convertView = mInflater.inflate(android.R.layout.simple_list_item_1, parent, false);
}
TextView textView = (TextView) convertView.findViewById(android.R.id.text1);
ScanResult scanResult = (ScanResult) getItem(position);
textView.setText(scanResult.SSID);
return convertView;
}
@Override
public Filter getFilter() {
return new Filter() {
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
// if (results != null && results.count > 0) {
// // 有过滤结果,显示自动完成列表
// adapter.updateDataSet((List<ScanResult>)results.values);
// }
}
@Override
protected FilterResults performFiltering(CharSequence constraint) {
FilterResults filterResults = new FilterResults();
filterResults.values = scanResults; // results是上面的过滤结果
filterResults.count = scanResults == null ? 0 : scanResults.size();
return filterResults;
}
@Override
public CharSequence convertResultToString(Object resultValue) {
ScanResult scanResult = (ScanResult) resultValue;
return scanResult.SSID;
}
};
}
}
private Object lock = new Object();
public void refreshSSIDSpinner() {
// synchronized (lock) {
scanResults = wifiManager.getScanResults();
if (scanResults != null) {
List<ScanResult> tmpScanResults = new ArrayList<ScanResult>();
List<String> rss = new ArrayList<String>();
for (ScanResult result : scanResults) {
if (!TextUtils.isEmpty(result.SSID)) {
rss.add(result.SSID);
} else {
tmpScanResults.add(result);
}
}
if (!tmpScanResults.isEmpty()) {
scanResults.removeAll(tmpScanResults);
}
if (adapter == null) {
if (getActivity() != null) {
adapter = new SSIDAdapter(getActivity(), scanResults);
}
} else {
adapter.updateDataSet(scanResults);
}
}
// }
}
private BroadcastReceiver ssidRefreshReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
if (WifiManager.SCAN_RESULTS_AVAILABLE_ACTION.equals(intent.getAction())) {
LogUtils.d("refreshCurrentSSID...");
mHandler.post(new Runnable() {
@Override
public void run() {
refreshSSIDSpinner();
}
});
}
}
};
public void onDestroy() {
if (timer != null) {
timer.cancel();
timer = null;
}
if (wakeLock != null) {
wakeLock.release();
}
getActivity().unregisterReceiver(ssidRefreshReceiver);
AbsOpenApi.cancel(getActivity(), true);
super.onDestroy();
};
}