package pl.llp.aircasting.activity.extsens;
import pl.llp.aircasting.Intents;
import pl.llp.aircasting.R;
import pl.llp.aircasting.activity.DialogActivity;
import pl.llp.aircasting.event.ConnectionUnsuccessfulEvent;
import pl.llp.aircasting.helper.NoOp;
import pl.llp.aircasting.helper.SettingsHelper;
import pl.llp.aircasting.sensor.ExternalSensorDescriptor;
import pl.llp.aircasting.sensor.external.ExternalSensors;
import pl.llp.aircasting.util.Constants;
import android.app.AlertDialog;
import android.bluetooth.BluetoothAdapter;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.ListView;
import android.widget.Toast;
import com.google.common.eventbus.EventBus;
import com.google.common.eventbus.Subscribe;
import com.google.inject.Inject;
import roboguice.inject.InjectView;
public class ExternalSensorActivity extends DialogActivity
{
@Inject Context context;
@Inject SensorAdapterFactory adapterFactory;
@Inject SettingsHelper settingsHelper;
@Inject ExternalSensors externalSensors;
@Inject EventBus eventBus;
@InjectView(R.id.paired_sensor_list) ListView pairedSensorList;
@InjectView(R.id.connected_sensors_list) ListView connectedSensorList;
@InjectView((R.id.pair_with_new_sensors_button)) Button openBluetoothButton;
BluetoothAdapter bluetoothAdapter;
PairedSensorAdapter pairedSensorAdapter;
ConnectedSensorAdapter connectedSensorAdapter;
AdapterInteractor sensorLists;
IOIOInteractor ioio = new IOIOInteractor();
private long bluetoothRequestTimestamp;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.external_sensors_list);
eventBus.register(this);
bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
pairedSensorAdapter = adapterFactory.getPairedSensorAdapter(this);
connectedSensorAdapter = adapterFactory.getConnectedSensorAdapter(this, settingsHelper);
pairedSensorList.setAdapter(pairedSensorAdapter);
pairedSensorList.setOnItemClickListener(new AdapterView.OnItemClickListener()
{
@Override
public void onItemClick(AdapterView<?> parent, View view, final int position, long id)
{
AlertDialog.Builder builder = new AlertDialog.Builder(context);
builder.setMessage(R.string.connect_sensor).
setCancelable(true).
setPositiveButton("Yes", new DialogInterface.OnClickListener()
{
@Override
public void onClick(DialogInterface dialog, int which)
{
ExternalSensorDescriptor connected = sensorLists.connectToActive(position);
ioio.startIfNecessary(connected, context);
Intents.restartSensors(context);
Intents.startStreamsActivity(ExternalSensorActivity.this);
}
}).setNegativeButton("No", NoOp.dialogOnClick());
AlertDialog dialog = builder.create();
dialog.show();
}
});
connectedSensorList.setAdapter(connectedSensorAdapter);
connectedSensorList.setOnItemClickListener(new AdapterView.OnItemClickListener()
{
@Override
public void onItemClick(AdapterView<?> parent, View view, final int position, long id)
{
AlertDialog.Builder builder = new AlertDialog.Builder(context);
builder.setMessage(R.string.disconnect_sensor).
setCancelable(true).
setPositiveButton("Yes", new DialogInterface.OnClickListener()
{
@Override
public void onClick(DialogInterface dialog, int which)
{
disconnectFrom(sensorLists.disconnect(position));
}
}).setNegativeButton("No", NoOp.dialogOnClick());
AlertDialog dialog = builder.create();
dialog.show();
}
});
sensorLists = new AdapterInteractor(this, pairedSensorAdapter, connectedSensorAdapter, settingsHelper);
}
private void disconnectFrom(final ExternalSensorDescriptor disconnected)
{
runOnUiThread(new Runnable()
{
@Override
public void run()
{
int pos = connectedSensorAdapter.findPosition(disconnected);
if(pos > -1)
{
sensorLists.disconnect(pos);
}
externalSensors.disconnect(disconnected.getAddress());
Intents.restartSensors(context);
ioio.stopIfNecessary(disconnected, context); }
});
}
@Subscribe
public void onEvent(ConnectionUnsuccessfulEvent event)
{
disconnectFrom(new ExternalSensorDescriptor(event.getDevice()));
}
@Override
protected void onResume() {
super.onResume();
eventBus.register(this);
if (bluetoothAdapter == null) {
Toast.makeText(context, R.string.bluetooth_not_supported, Toast.LENGTH_LONG).show();
finish();
return;
}
sensorLists.updateKnownSensorListVisibility();
ioio.startPreviouslyConnectedIOIO(settingsHelper, context);
openBluetoothButton.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
if(!bluetoothAdapter.isDiscovering())
{
bluetoothAdapter.startDiscovery();
}
Intent intent = new Intent();
intent.setAction(android.provider.Settings.ACTION_BLUETOOTH_SETTINGS);
context.startActivity(intent);
}
});
if (!bluetoothAdapter.isEnabled())
{
long now = System.currentTimeMillis();
if(now - bluetoothRequestTimestamp > Constants.ONE_SECOND)
{
Intents.requestEnableBluetooth(this);
}
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
if(requestCode == Intents.REQUEST_ENABLE_BLUETOOTH)
{
bluetoothRequestTimestamp = System.currentTimeMillis();
}
}
@Override
protected void onPause()
{
super.onPause();
openBluetoothButton.setOnClickListener(null);
eventBus.unregister(this);
}
}