package com.xinzhongxin.bletester;

import java.util.Timer;
import java.util.TimerTask;

import android.annotation.SuppressLint;
import android.app.Activity;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothAdapter.LeScanCallback;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothManager;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.os.Bundle;
import android.os.Handler;
import android.support.v4.widget.SwipeRefreshLayout;
import android.support.v4.widget.SwipeRefreshLayout.OnRefreshListener;
import android.view.KeyEvent;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.Toast;
import android.widget.AdapterView.OnItemClickListener;

import com.xinzhongxin.adapter.BleDeviceListAdapter;
import com.xinzhongxin.utils.Utils;
import com.xinzhongxinbletester.R;

public class MainActivity extends Activity {
	ListView listView;
	SwipeRefreshLayout swagLayout;
	BluetoothAdapter mBluetoothAdapter;
	private LeScanCallback mLeScanCallback;
	BleDeviceListAdapter mBleDeviceListAdapter;
	boolean isExit;
	Handler handler;

	SharedPreferences sharedPreferences;
	Editor editor;

	@SuppressLint("NewApi")
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		getActionBar().setTitle(R.string.app_title);
		sharedPreferences = getPreferences(0);
		editor = sharedPreferences.edit();
		init();
		getBleAdapter();
		getScanResualt();
		new Thread(new Runnable() {
			@SuppressWarnings("deprecation")
			@Override
			public void run() {
				// TODO Auto-generated method stub
				mBluetoothAdapter.startLeScan(mLeScanCallback);
			}
		}).start();
	}

	private void init() {
		// TODO Auto-generated method stub
		listView = (ListView) findViewById(R.id.lv_deviceList);
		listView.setEmptyView(findViewById(R.id.pb_empty));
		swagLayout = (SwipeRefreshLayout) findViewById(R.id.swagLayout);
		swagLayout.setVisibility(View.VISIBLE);
		swagLayout.setOnRefreshListener(new OnRefreshListener() {

			@SuppressWarnings("deprecation")
			@SuppressLint("NewApi")
			@Override
			public void onRefresh() {
				// TODO Auto-generated method stub
				mBleDeviceListAdapter.clear();
				mBluetoothAdapter.startLeScan(mLeScanCallback);
				swagLayout.setRefreshing(false);
			}
		});
		mBleDeviceListAdapter = new BleDeviceListAdapter(this);
		listView.setAdapter(mBleDeviceListAdapter);
		setListItemListener();
	}

	@SuppressLint("NewApi")
	private void getBleAdapter() {
		final BluetoothManager bluetoothManager = (BluetoothManager) this
				.getSystemService(Context.BLUETOOTH_SERVICE);
		mBluetoothAdapter = bluetoothManager.getAdapter();
	}

	@SuppressLint("NewApi")
	private void getScanResualt() {
		mLeScanCallback = new LeScanCallback() {
			@Override
			public void onLeScan(final BluetoothDevice device, final int rssi,
					final byte[] scanRecord) {
				MainActivity.this.runOnUiThread(new Runnable() {
					public void run() {
						mBleDeviceListAdapter.addDevice(device, rssi,
								Utils.bytesToHex(scanRecord));
						mBleDeviceListAdapter.notifyDataSetChanged();
						invalidateOptionsMenu();
					}
				});
			}
		};
	}

	private void setListItemListener() {
		listView.setOnItemClickListener(new OnItemClickListener() {
			@SuppressLint("NewApi")
			@Override
			public void onItemClick(AdapterView<?> parent, View view,
					int position, long id) {
				// TODO Auto-generated method stub
				BluetoothDevice device = mBleDeviceListAdapter
						.getDevice(position);
				final Intent intent = new Intent(MainActivity.this,
						DeviceConnect.class);
				intent.putExtra(DeviceConnect.EXTRAS_DEVICE_NAME,
						device.getName());
				intent.putExtra(DeviceConnect.EXTRAS_DEVICE_ADDRESS,
						device.getAddress());
				startActivity(intent);
			}
		});
	}

	@SuppressLint("NewApi")
	@Override
	protected void onResume() {
		// TODO Auto-generated method stub
		super.onResume();
	}

	@SuppressWarnings("deprecation")
	@SuppressLint("NewApi")
	@Override
	protected void onDestroy() {
		// TODO Auto-generated method stub
		super.onDestroy();
		mBluetoothAdapter.stopLeScan(mLeScanCallback);
		mBleDeviceListAdapter.clear();
		mBluetoothAdapter.cancelDiscovery();
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		getMenuInflater().inflate(R.menu.main, menu);
		menu.getItem(0).setTitle("��" + mBleDeviceListAdapter.getCount() + "��");
		return true;
	}

	@SuppressWarnings("deprecation")
	@SuppressLint("NewApi")
	@Override
	public boolean onOptionsItemSelected(MenuItem item) {
		switch (item.getItemId()) {
		case R.id.menu_stop:
			mBluetoothAdapter.stopLeScan(mLeScanCallback);
			break;
		case R.id.menu_autoconnect:
			if (sharedPreferences.getBoolean("AutoConnect", true)) {
				editor.putBoolean("AutoConnect", false);
				editor.commit();
				Toast.makeText(this, "ȡ��Զ�����", Toast.LENGTH_SHORT).show();
			} else {
				editor.putBoolean("AutoConnect", true);
				editor.commit();
				Toast.makeText(this, "������Ϊ�Ͽ����Զ�����", Toast.LENGTH_SHORT).show();
			}
			break;
		case R.id.menu_about:
			MainActivity.this.startActivity(new Intent(this,
					AboutActivity.class));
		case R.id.menu_qrcode:
			MainActivity.this.startActivity(new Intent(this,
					QrcodeActivity.class));
		}
		return super.onOptionsItemSelected(item);
	}

	public boolean onKeyDown(int keyCode, KeyEvent event) {
		if (keyCode == KeyEvent.KEYCODE_BACK) {
			exitBy2Click();
		}
		return false;
	}

	private void exitBy2Click() {
		if (!isExit) {
			isExit = true;
			Toast.makeText(this, "�ٰ�һ���˳�", Toast.LENGTH_SHORT).show();
			new Timer().schedule(new TimerTask() {
				public void run() {
					isExit = false;
				}
			}, 2000);
		} else {
			onDestroy();
			finish();
			System.exit(0);
		}
	}

}