/* @file DeviceList.java
*
* @author marco corvi
* @date nov 2011
*
* @brief TopoDroid DistoX device list activity
* --------------------------------------------------------
* Copyright This sowftare is distributed under GPL-3.0 or later
* See the file COPYING.
* --------------------------------------------------------
*/
package com.topodroid.DistoX;
import java.util.Set;
import android.app.Activity;
import android.os.Bundle;
import android.content.Intent;
import android.util.Log;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.TextView;
import android.widget.ListView;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.Toast;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothAdapter;
import android.content.BroadcastReceiver;
import android.content.IntentFilter;
import android.content.Context;
public class DeviceList extends Activity
implements OnItemClickListener
{
private TopoDroidApp mApp;
public static final int DEVICE_PAIR = 0x1;
public static final int DEVICE_SCAN = 0x2;
private ArrayAdapter<String> mArrayAdapter;
private ListView mList;
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate( savedInstanceState );
setContentView(R.layout.device_list);
mApp = (TopoDroidApp) getApplication();
mArrayAdapter = new ArrayAdapter<String>( this, R.layout.message );
// mDataAdapter = new ArrayAdapter<String>( this, R.layout.data );
mList = (ListView) findViewById(R.id.list);
mList.setAdapter( mArrayAdapter );
mList.setOnItemClickListener( this );
mList.setDividerHeight( 2 );
// setTitleColor( 0x006d6df6 );
int command = getIntent().getExtras().getInt( TDTag.TOPODROID_DEVICE_ACTION );
// TDLog.Log( TDLog.LOG_BT, "command " + command );
switch ( command )
{
case DEVICE_PAIR:
showPairedDevices();
break;
case DEVICE_SCAN:
scanBTDevices();
break;
default: // 0x0 or unknown
// TDLog.Log(TDLog.LOG_BT, "Unknown intent command! ("+command+")");
}
}
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id)
{
CharSequence item = ((TextView) view).getText();
String value = item.toString();
// TDLog.Log( TDLog.LOG_BT, "onItemClick " + mDistoX.StatusName() + " value: " + value + " pos " + position );
if ( value.startsWith( "DistoX", 0 ) || value.startsWith( "A3", 0 ) || value.startsWith( "X310", 0 ) )
{
StringBuffer buf = new StringBuffer( item );
int k = buf.lastIndexOf(" ");
String address = buf.substring(k+1);
// Toast.makeText( mApp.getApplicationContext(), address, Toast.LENGTH_SHORT).show();
TDLog.Log( TDLog.LOG_BT, "DeviceList item click Address " + address );
Intent intent = new Intent();
intent.putExtra( TDTag.TOPODROID_DEVICE_ACTION, address );
setResult( RESULT_OK, intent );
} else {
setResult( RESULT_CANCELED );
}
finish();
}
private void showPairedDevices()
{
if ( mApp.mBTAdapter != null ) {
Set<BluetoothDevice> device_set = mApp.mBTAdapter.getBondedDevices();
if ( device_set.isEmpty() ) {
Toast.makeText(this, R.string.no_paired_device, Toast.LENGTH_SHORT).show();
} else {
setTitle( R.string.title_device );
mArrayAdapter.clear();
for ( BluetoothDevice device : device_set ) {
// Log.v("DistoX", "paired device <" + device.getName() + "> " + device.getAddress() );
mArrayAdapter.add( "DistoX " + device.getName() + " " + device.getAddress() );
}
}
// TDLog.Log( TDLog.LOG_BT, "showPairedDevices n. " + mArrayAdapter.getCount() );
} else {
Toast.makeText(this, R.string.not_available, Toast.LENGTH_SHORT).show();
}
}
private BroadcastReceiver mBTReceiver = null;
private void scanBTDevices()
{
TDLog.Log( TDLog.LOG_BT, "scanBTDevices" );
// Log.v( "DistoX", "scanBTDevices" );
mArrayAdapter.clear();
resetReceiver(); // FIXME should not be necessary
mBTReceiver = new BroadcastReceiver()
{
@Override
public void onReceive( Context ctx, Intent data )
{
String action = data.getAction();
// TDLog.Log( TDLog.LOG_BT, "onReceive action " + action );
if ( BluetoothAdapter.ACTION_DISCOVERY_STARTED.equals( action ) ) {
TDLog.Log( TDLog.LOG_BT, "onReceive BT DISCOVERY STARTED" );
setTitle( R.string.title_discover );
} else if ( BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals( action ) ) {
TDLog.Log( TDLog.LOG_BT, "onReceive BT DISCOVERY FINISHED, found " + mArrayAdapter.getCount() );
setTitle( R.string.title_device );
resetReceiver();
if ( mArrayAdapter.getCount() < 1 ) {
Toast.makeText( mApp.getApplicationContext(), R.string.no_device_found, Toast.LENGTH_SHORT).show();
finish(); // no need to keep list of scanned distox open
}
} else if ( BluetoothDevice.ACTION_FOUND.equals( action ) ) {
BluetoothDevice device = data.getParcelableExtra( BluetoothDevice.EXTRA_DEVICE );
TDLog.Log( TDLog.LOG_BT, "onReceive BT DEVICES FOUND, name " + device.getName() );
if ( device.getBondState() != BluetoothDevice.BOND_BONDED ) {
String model = device.getName();
if ( model != null && model.startsWith("DistoX") ) { // DistoX and DistoX2
String device_addr = device.getAddress();
String name = Device.modelToName( model );
// Log.v( "DistoX", "scan receiver <" + name + "> " + device_addr );
mApp.mDData.insertDevice( device_addr, model, name );
mArrayAdapter.add( Device.typeString[ Device.stringToType(model) ] + " " + name + " " + device_addr );
}
}
// } else if ( BluetoothDevice.ACTION_ACL_CONNECTED.equals( action ) ) {
// TDLog.Log( TDLog.LOG_BT, "ACL_CONNECTED");
// } else if ( BluetoothDevice.ACTION_ACL_DISCONNECT_REQUESTED.equals( action ) ) {
// TDLog.Log( TDLog.LOG_BT, "ACL_DISCONNECT_REQUESTED");
// } else if ( BluetoothDevice.ACTION_ACL_DISCONNECTED.equals( action ) ) {
// // Bundle extra = data.getExtras();
// // String device = extra.getString( BluetoothDevice.EXTRA_DEVICE ).toString();
// // Log.v("DistoX", "DeviceList ACL_DISCONNECTED from " + device );
// TDLog.Log( TDLog.LOG_BT, "ACL_DISCONNECTED");
}
}
};
IntentFilter foundFilter = new IntentFilter( BluetoothDevice.ACTION_FOUND );
IntentFilter startFilter = new IntentFilter( BluetoothAdapter.ACTION_DISCOVERY_STARTED );
IntentFilter finishFilter = new IntentFilter( BluetoothAdapter.ACTION_DISCOVERY_FINISHED );
// IntentFilter connectedFilter = new IntentFilter( BluetoothDevice.ACTION_ACL_CONNECTED );
// IntentFilter disconnectRequestFilter = new IntentFilter( BluetoothDevice.ACTION_ACL_DISCONNECT_REQUESTED );
// IntentFilter disconnectedFilter = new IntentFilter( BluetoothDevice.ACTION_ACL_DISCONNECTED );
// IntentFilter uuidFilter = new IntentFilter( myUUIDaction );
// IntentFilter bondFilter = new IntentFilter( BluetoothDevice.ACTION_BOND_STATE_CHANGED );
registerReceiver( mBTReceiver, foundFilter );
registerReceiver( mBTReceiver, startFilter );
registerReceiver( mBTReceiver, finishFilter );
// registerReceiver( mBTReceiver, connectedFilter );
// registerReceiver( mBTReceiver, disconnectRequestFilter );
// registerReceiver( mBTReceiver, disconnectedFilter );
// registerReceiver( mBTReceiver, uuidFilter );
// registerReceiver( mBTReceiver, bondFilter );
mArrayAdapter.clear();
mApp.mBTAdapter.startDiscovery();
}
@Override
public void onStop()
{
super.onStop();
resetReceiver();
}
private void resetReceiver()
{
if ( mBTReceiver != null ) {
TDLog.Log( TDLog.LOG_BT, "resetReceiver");
unregisterReceiver( mBTReceiver );
mBTReceiver = null;
}
}
// private void ensureDiscoverable()
// {
// if ( mBTAdapter.getScanMode() != BluetoothAdapter.SCAN_MODE_CONNECTABLE_DISCOVERABLE ) {
// Intent discoverIntent = new Intent( BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE );
// discoverIntent.putExtra( BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 300 );
// startActivity( discoverIntent );
// }
// }
}