package com.clj.blesample.tool.scan;
import android.app.ProgressDialog;
import android.bluetooth.BluetoothDevice;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.view.animation.LinearInterpolator;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
import com.clj.blesample.R;
import com.clj.blesample.tool.BluetoothService;
import com.clj.blesample.tool.operation.OperationActivity;
import com.clj.fastble.data.ScanResult;
import java.util.ArrayList;
import java.util.List;
public class AnyScanActivity extends AppCompatActivity implements View.OnClickListener {
private Button btn_start, btn_stop;
private ImageView img_loading;
private Animation operatingAnim;
private ResultAdapter mResultAdapter;
private ProgressDialog progressDialog;
private BluetoothService mBluetoothService;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_any_scan);
initView();
}
@Override
protected void onDestroy() {
super.onDestroy();
if (mBluetoothService != null)
unbindService();
}
private void initView() {
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
toolbar.setTitle("搜索设备");
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
toolbar.setNavigationOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
finish();
}
});
btn_start = (Button) findViewById(R.id.btn_start);
btn_start.setOnClickListener(this);
btn_stop = (Button) findViewById(R.id.btn_stop);
btn_stop.setOnClickListener(this);
img_loading = (ImageView) findViewById(R.id.img_loading);
operatingAnim = AnimationUtils.loadAnimation(this, R.anim.rotate);
operatingAnim.setInterpolator(new LinearInterpolator());
progressDialog = new ProgressDialog(this);
mResultAdapter = new ResultAdapter(this);
ListView listView_device = (ListView) findViewById(R.id.list_device);
listView_device.setAdapter(mResultAdapter);
listView_device.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
if (mBluetoothService != null) {
mBluetoothService.cancelScan();
mBluetoothService.connectDevice(mResultAdapter.getItem(position));
}
}
});
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn_start:
if (mBluetoothService == null) {
bindService();
} else {
mBluetoothService.scanDevice();
}
break;
case R.id.btn_stop:
if (mBluetoothService != null) {
mBluetoothService.cancelScan();
}
break;
}
}
private class ResultAdapter extends BaseAdapter {
private Context context;
private List<ScanResult> scanResultList;
ResultAdapter(Context context) {
this.context = context;
scanResultList = new ArrayList<>();
}
void addResult(ScanResult result) {
scanResultList.add(result);
}
void clear() {
scanResultList.clear();
}
@Override
public int getCount() {
return scanResultList.size();
}
@Override
public ScanResult getItem(int position) {
if (position > scanResultList.size())
return null;
return scanResultList.get(position);
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ResultAdapter.ViewHolder holder;
if (convertView != null) {
holder = (ResultAdapter.ViewHolder) convertView.getTag();
} else {
convertView = View.inflate(context, R.layout.adapter_scan_result, null);
holder = new ResultAdapter.ViewHolder();
convertView.setTag(holder);
holder.txt_name = (TextView) convertView.findViewById(R.id.txt_name);
holder.txt_mac = (TextView) convertView.findViewById(R.id.txt_mac);
holder.txt_rssi = (TextView) convertView.findViewById(R.id.txt_rssi);
}
ScanResult result = scanResultList.get(position);
BluetoothDevice device = result.getDevice();
String name = device.getName();
String mac = device.getAddress();
int rssi = result.getRssi();
holder.txt_name.setText(name);
holder.txt_mac.setText(mac);
holder.txt_rssi.setText(String.valueOf(rssi));
return convertView;
}
class ViewHolder {
TextView txt_name;
TextView txt_mac;
TextView txt_rssi;
}
}
private void bindService() {
Intent bindIntent = new Intent(this, BluetoothService.class);
this.bindService(bindIntent, mFhrSCon, Context.BIND_AUTO_CREATE);
}
private void unbindService() {
this.unbindService(mFhrSCon);
}
private ServiceConnection mFhrSCon = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
mBluetoothService = ((BluetoothService.BluetoothBinder) service).getService();
mBluetoothService.setScanCallback(callback);
mBluetoothService.scanDevice();
}
@Override
public void onServiceDisconnected(ComponentName name) {
mBluetoothService = null;
}
};
private BluetoothService.Callback callback = new BluetoothService.Callback() {
@Override
public void onStartScan() {
mResultAdapter.clear();
mResultAdapter.notifyDataSetChanged();
img_loading.startAnimation(operatingAnim);
btn_start.setEnabled(false);
btn_stop.setVisibility(View.VISIBLE);
}
@Override
public void onScanning(ScanResult result) {
mResultAdapter.addResult(result);
mResultAdapter.notifyDataSetChanged();
}
@Override
public void onScanComplete() {
img_loading.clearAnimation();
btn_start.setEnabled(true);
btn_stop.setVisibility(View.INVISIBLE);
}
@Override
public void onConnecting() {
progressDialog.show();
}
@Override
public void onConnectFail() {
img_loading.clearAnimation();
btn_start.setEnabled(true);
btn_stop.setVisibility(View.INVISIBLE);
progressDialog.dismiss();
Toast.makeText(AnyScanActivity.this, "连接失败", Toast.LENGTH_LONG).show();
}
@Override
public void onDisConnected() {
progressDialog.dismiss();
mResultAdapter.clear();
mResultAdapter.notifyDataSetChanged();
img_loading.clearAnimation();
btn_start.setEnabled(true);
btn_stop.setVisibility(View.INVISIBLE);
Toast.makeText(AnyScanActivity.this, "连接断开", Toast.LENGTH_LONG).show();
}
@Override
public void onServicesDiscovered() {
progressDialog.dismiss();
startActivity(new Intent(AnyScanActivity.this, OperationActivity.class));
}
};
}