package com.example.focus; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; import android.app.Activity; import android.bluetooth.BluetoothAdapter; import android.bluetooth.BluetoothDevice; import android.bluetooth.BluetoothGatt; import android.bluetooth.BluetoothManager; import android.bluetooth.BluetoothProfile; import android.content.BroadcastReceiver; import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.content.ServiceConnection; import android.graphics.Color; import android.os.Bundle; import android.os.Handler; import android.os.IBinder; import android.os.Message; import android.util.Log; import android.view.LayoutInflater; 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.BaseAdapter; import android.widget.Button; import android.widget.ListView; import android.widget.TextView; import android.widget.Toast; public class DevicesActivity extends Activity { // ListView lvDevices; private BluetoothAdapter mBtAdapter; private TextView mEmptyList; public static final String TAG = "DeviceListActivity"; private WorkableService mService = null; List<BluetoothDevice> deviceList; private BluetoothManager mBluetoothManager; private DeviceAdapter deviceAdapter; private ServiceConnection onService = null; String[] devices = new String[] {}; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Debugger.d(TAG, "onCreate"); mBluetoothManager = (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE); mBtAdapter = mBluetoothManager.getAdapter(); // getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, // R.layout.title_bar); setContentView(R.layout.device_list); // getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, // R.layout.title_bar); setContentView(R.layout.device_list); onService = new ServiceConnection() { public void onServiceConnected(ComponentName className, IBinder rawBinder) { mService = ((WorkableService.LocalBinder) rawBinder).getService(); if (mService != null) { mService.setDeviceListHandler(mHandler); } populateList(); } public void onServiceDisconnected(ComponentName classname) { mService = null; } }; // start service, if not already running (but it is) startService(new Intent(this, WorkableService.class)); Intent bindIntent = new Intent(this, WorkableService.class); bindService(bindIntent, onService, Context.BIND_AUTO_CREATE); // mBtAdapter = BluetoothAdapter.getDefaultAdapter(); mEmptyList = (TextView) findViewById(R.id.empty); Button cancelButton = (Button) findViewById(R.id.btn_cancel); cancelButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { finish(); } }); } // @Override // public void onItemClick(AdapterView<?> parent, View view, int position, // long id) { // // Toast.makeText(this, "Device: " + ((TextView)view).getText(), // Toast.LENGTH_SHORT).show(); // } // private Handler mHandler = new Handler() { @Override public void handleMessage(Message msg) { switch (msg.what) { // Gatt device found message. case WorkableService.GATT_DEVICE_FOUND_MSG: Bundle data = msg.getData(); final BluetoothDevice device = data.getParcelable(BluetoothDevice.EXTRA_DEVICE); runOnUiThread(new Runnable() { @Override public void run() { addDevice(device); } }); break; default: super.handleMessage(msg); } } }; private void populateList() { /* Initialize device list container */ Debugger.d(TAG, "populateList"); deviceList = new ArrayList<BluetoothDevice>(); deviceAdapter = new DeviceAdapter(this, deviceList); // devRssiValues = new HashMap<String, Integer>(); ListView newDevicesListView = (ListView) findViewById(R.id.new_devices); newDevicesListView.setAdapter(deviceAdapter); newDevicesListView.setOnItemClickListener(mDeviceClickListener); Set<BluetoothDevice> pairedDevices = mBtAdapter.getBondedDevices(); for (BluetoothDevice pairedDevice : pairedDevices) addDevice(pairedDevice); mService.scan(true); } private void addDevice(BluetoothDevice device) { boolean deviceFound = false; for (BluetoothDevice listDev : deviceList) { if (listDev.getAddress().equals(device.getAddress())) { deviceFound = true; break; } } // devRssiValues.put(device.getAddress(), rssi); if (!deviceFound) { mEmptyList.setVisibility(View.GONE); deviceList.add(device); deviceAdapter.notifyDataSetChanged(); } } @Override public void onStart() { super.onStart(); Debugger.d(TAG, "onStart mService= " + mService); IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND); filter.addAction(BluetoothAdapter.ACTION_DISCOVERY_FINISHED); filter.addAction(BluetoothAdapter.ACTION_STATE_CHANGED); this.registerReceiver(mReceiver, filter); } @Override public void onStop() { super.onStop(); unregisterReceiver(mReceiver); } @Override protected void onDestroy() { super.onDestroy(); unbindService(onService); mService.scan(false); } private OnItemClickListener mDeviceClickListener = new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { BluetoothDevice device = deviceList.get(position); if (mBluetoothManager.getConnectionState(device,BluetoothGatt.GATT_SERVER) == BluetoothProfile.STATE_CONNECTED) { Debugger.i(TAG, "connected device"); showMessage("device already connected"); return; } mService.scan(false); Bundle b = new Bundle(); b.putString(BluetoothDevice.EXTRA_DEVICE, deviceList.get(position).getAddress()); Intent result = new Intent(); result.putExtras(b); setResult(Activity.RESULT_OK, result); finish(); } }; /** * The BroadcastReceiver that listens for discovered devices and changes the * title when discovery is finished. */ private final BroadcastReceiver mReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)) { setProgressBarIndeterminateVisibility(false); setTitle(R.string.select_device); if (deviceList.size() == 0) { mEmptyList.setText(R.string.no_ble_devices); } } if (BluetoothAdapter.ACTION_STATE_CHANGED.equals(action)) { if (!mBtAdapter.isEnabled()) finish(); } } }; class DeviceAdapter extends BaseAdapter { Context context; List<BluetoothDevice> devices; LayoutInflater inflater; public DeviceAdapter(Context context, List<BluetoothDevice> devices) { this.context = context; inflater = LayoutInflater.from(context); this.devices = devices; } @Override public int getCount() { return devices.size(); } @Override public Object getItem(int position) { return devices.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { ViewGroup vg; if (convertView != null) { vg = (ViewGroup) convertView; } else { vg = (ViewGroup) inflater.inflate(R.layout.device_element, null); } BluetoothDevice device = devices.get(position); final TextView tvadd = ((TextView) vg.findViewById(R.id.address)); final TextView tvname = ((TextView) vg.findViewById(R.id.name)); final TextView tvpaired = (TextView) vg.findViewById(R.id.paired); tvname.setText(device.getName()); tvadd.setText(device.getAddress()); if (device.getBondState() == BluetoothDevice.BOND_BONDED) { Debugger.i(TAG, "device::" + device.getName()); tvname.setTextColor(Color.GRAY); tvadd.setTextColor(Color.GRAY); tvpaired.setTextColor(Color.GRAY); tvpaired.setVisibility(View.VISIBLE); tvpaired.setText(R.string.paired); } else { tvname.setTextColor(Color.WHITE); tvadd.setTextColor(Color.WHITE); tvpaired.setVisibility(View.GONE); } try { int state = mBluetoothManager.getConnectionState(device, BluetoothGatt.GATT); if (state == BluetoothProfile.STATE_CONNECTED) { Debugger.i(TAG, "connected device::" + device.getName()); tvname.setTextColor(Color.WHITE); tvadd.setTextColor(Color.WHITE); tvpaired.setVisibility(View.VISIBLE); tvpaired.setText(R.string.connected); } } catch(Exception ex) { Debugger.e(TAG, ex.getMessage()); } // else if (mService.mBluetoothGattServer.getConnectionState(device) // == BluetoothProfile.STATE_CONNECTED) { // Log.i(TAG, "connected device::gatt server"+device.getName()); // tvname.setTextColor(Color.WHITE); // tvadd.setTextColor(Color.WHITE); // tvpaired.setVisibility(View.VISIBLE); // tvpaired.setText(R.string.connected); // } return vg; } } private void showMessage(String msg) { Toast.makeText(this, msg, Toast.LENGTH_SHORT).show(); } }