package uk.org.smithfamily.mslogger.activity; import java.util.ArrayList; import java.util.List; import uk.org.smithfamily.mslogger.ApplicationSettings; import uk.org.smithfamily.mslogger.R; import android.app.Activity; import android.os.Bundle; import android.text.Editable; import android.text.TextWatcher; import android.view.View; import android.view.View.OnClickListener; import android.widget.ArrayAdapter; import android.widget.Button; import android.widget.EditText; import android.widget.ListView; /** * Activity that can be launched when viewing a datalog to select the datalog fields to view */ public class DatalogFieldsActivity extends Activity implements OnClickListener { private ListView datalogsList; private ArrayAdapter<String> mDatalogsArrayAdapter; private EditText filterFields; private Button btnOk; private Button btnCancel; public static final int BACK_FROM_DATALOG_FIELDS = 1; /** * Initialise the activity and all its items */ @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.datalog_fields); setTitle("Select datalog fields"); btnOk = (Button) findViewById(R.id.ok); btnOk.setOnClickListener(this); btnCancel = (Button) findViewById(R.id.cancel); btnCancel.setOnClickListener(this); filterFields = (EditText) findViewById(R.id.filterFields); filterFields.addTextChangedListener(filterTextWatcher); fillDatalogFieldsList(); } /** * Make sure we remove the text changed listener when the activity is destroyed */ @Override protected void onDestroy() { super.onDestroy(); filterFields.removeTextChangedListener(filterTextWatcher); } /** * Text watcher that will monitor the edit text and apply the filter to the list */ private TextWatcher filterTextWatcher = new TextWatcher() { @Override public void afterTextChanged(Editable s) { } public void beforeTextChanged(CharSequence s, int start, int count, int after) { } public void onTextChanged(CharSequence s, int start, int before, int count) { mDatalogsArrayAdapter.getFilter().filter(s); } }; /** * Fill the list view with all availables datalog fields */ private void fillDatalogFieldsList() { datalogsList = (ListView) findViewById(android.R.id.list); datalogsList.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE); datalogsList.setItemsCanFocus(true); mDatalogsArrayAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_multiple_choice); Bundle b = getIntent().getExtras(); String[] datalogFields = b.getStringArray("datalog_fields"); String[] selectedDatalogFields = ApplicationSettings.INSTANCE.getDatalogFields(); for (String datalogField : datalogFields) { mDatalogsArrayAdapter.add(datalogField); } datalogsList.setAdapter(mDatalogsArrayAdapter); // Check the currently selected datalog fields for (int i = 0; i < datalogsList.getAdapter().getCount(); i++) { for (int j = 0; j < selectedDatalogFields.length; j++) { if (selectedDatalogFields[j].equals(datalogsList.getItemAtPosition(i).toString())) { datalogsList.setItemChecked(i, true); } } } } /** * This is triggered when the "OK" or "Cancel" button are clicked * * @param v */ @Override public void onClick(View v) { int which = v.getId(); if (which == R.id.ok) { // Build array of datalog fields name to save in application settings List<String> datalogFields = new ArrayList<String>(); for (int i = 0; i < datalogsList.getAdapter().getCount(); i++) { // Time should always be there if (datalogsList.isItemChecked(i) || datalogsList.getItemAtPosition(i).toString().equals("Time")) { datalogFields.add(datalogsList.getItemAtPosition(i).toString()); } } ApplicationSettings.INSTANCE.setDatalogFields(datalogFields.toArray(new String[datalogFields.size()])); if (getParent() == null) { setResult(BACK_FROM_DATALOG_FIELDS); } else { getParent().setResult(BACK_FROM_DATALOG_FIELDS); } finish(); } else if (which == R.id.cancel) { finish(); } } }