package com.openxc.enabler;
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.v4.app.ListFragment;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Spinner;
import com.openxc.VehicleManager;
import com.openxc.messages.CanMessage;
import com.openxc.messages.formatters.ByteAdapter;
import com.openxcplatform.enabler.R;
public class SendCanMessageFragment extends ListFragment {
private static String TAG = "SendCanMessageFragment";
private VehicleManager mVehicleManager;
private VehicleMessageAdapter mAdapter;
private ServiceConnection mConnection = new ServiceConnection() {
public void onServiceConnected(ComponentName className,
IBinder service) {
Log.i(TAG, "Bound to VehicleManager");
mVehicleManager = ((VehicleManager.VehicleBinder)service
).getService();
}
public void onServiceDisconnected(ComponentName className) {
Log.w(TAG, "VehicleService disconnected unexpectedly");
mVehicleManager = null;
}
};
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mAdapter = new CanMessageAdapter(getActivity());
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
final View v = inflater.inflate(R.layout.send_can_message_fragment,
container, false);
final Spinner spinner = (Spinner) v.findViewById(R.id.bus_spinner);
// Create an ArrayAdapter using the string array and a default spinner
// layout
ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(
getActivity(), R.array.buses_array
, android.R.layout.simple_spinner_item);
// Specify the layout to use when the list of choices appears
adapter.setDropDownViewResource(
android.R.layout.simple_spinner_dropdown_item);
// Apply the adapter to the spinner
spinner.setAdapter(adapter);
Button btn = (Button) v.findViewById(R.id.send_request);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View buttonView) {
onSendCanMessage(spinner,
(EditText) v.findViewById(R.id.message_id),
(EditText) v.findViewById(R.id.message_payload));
}
});
return v;
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
setListAdapter(mAdapter);
}
private void onSendCanMessage(Spinner busSpinner,
EditText idView, EditText payloadView) {
boolean validInput = true;
if(idView.getText().toString().isEmpty()) {
idView.setError("ID is required");
validInput = false;
}
if(payloadView.getText().toString().isEmpty()) {
payloadView.setError("Payload is required");
validInput = false;
}
if(payloadView.getText().toString().length() % 2 == 1) {
payloadView.setError("Payload must be specified as full bytes");
validInput = false;
}
if(validInput) {
System.out.println(payloadView.getText().toString());
CanMessage message = new CanMessage(
Integer.valueOf(busSpinner.getSelectedItem().toString()),
Integer.valueOf(idView.getText().toString(), 16),
ByteAdapter.hexStringToByteArray(payloadView.getText().toString()));
mVehicleManager.send(message);
// Make sure to update after sending so the timestamp is set by the
// VehicleManager
mAdapter.add(message.asCanMessage());
} else {
Log.i(TAG, "Form is invalid, not sending message");
}
}
@Override
public void onResume() {
super.onResume();
getActivity().bindService(
new Intent(getActivity(), VehicleManager.class),
mConnection, Context.BIND_AUTO_CREATE);
}
@Override
public void onPause() {
super.onPause();
if(mVehicleManager != null) {
Log.i(TAG, "Unbinding from vehicle service");
getActivity().unbindService(mConnection);
mVehicleManager = null;
}
}
}