package org.oobd.ui.android; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.Collections; import java.util.Enumeration; import java.util.Iterator; import java.util.List; import java.util.Vector; import java.util.logging.Level; import java.util.logging.Logger; import org.json.JSONException; import org.json.JSONObject; import org.oobd.base.OOBDConstants; import org.oobd.base.support.Onion; import org.oobd.base.support.OnionNoEntryException; import org.oobd.base.visualizer.Visualizer; import org.oobd.ui.android.application.OOBDApp; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Color; import android.graphics.drawable.Drawable; import android.text.Editable; import android.text.TextWatcher; import android.view.KeyEvent; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.view.inputmethod.EditorInfo; import android.widget.AdapterView; import android.widget.AdapterView.OnItemSelectedListener; import android.widget.ArrayAdapter; import android.widget.CheckBox; import android.widget.CheckedTextView; import android.widget.CompoundButton; import android.widget.EditText; import android.widget.ListView; import android.widget.ProgressBar; import android.widget.SeekBar; import android.widget.SeekBar.OnSeekBarChangeListener; import android.widget.Spinner; import android.widget.TextView; import android.widget.ImageView; import android.widget.TextView.OnEditorActionListener; /** * @author Andreas Budde, Peter Mayer Adapter to show the differen * {@link Visualizer} in a {@link ListView} */ public class DiagnoseAdapter extends ArrayAdapter<Visualizer> { private final LayoutInflater mlayoutInflater; VizTable myVisualizer; Context context; private Bitmap[] myIcons = new Bitmap[6]; public BroadcastReceiver receiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { int updateLevel = intent.getIntExtra(OOBDApp.UPDATE_LEVEL, 0); notifyDataSetChanged(); } }; public DiagnoseAdapter(Context context, ArrayList<Visualizer> items) { super(context, 0, items); mlayoutInflater = LayoutInflater.from(context); myVisualizer = (VizTable) items; myIcons[0] = BitmapFactory.decodeResource(MainActivity .getMyMainActivity().getResources(), R.drawable.blank); myIcons[1] = BitmapFactory.decodeResource(MainActivity .getMyMainActivity().getResources(), R.drawable.forward); myIcons[2] = BitmapFactory.decodeResource(MainActivity .getMyMainActivity().getResources(), R.drawable.update); myIcons[3] = BitmapFactory.decodeResource(MainActivity .getMyMainActivity().getResources(), R.drawable.timer); myIcons[4] = BitmapFactory.decodeResource(MainActivity .getMyMainActivity().getResources(), R.drawable.text); myIcons[5] = BitmapFactory.decodeResource(MainActivity .getMyMainActivity().getResources(), R.drawable.back); this.context = context; context.registerReceiver(receiver, new IntentFilter( OOBDApp.VISUALIZER_UPDATE)); } public void guiPaused() { context.unregisterReceiver(receiver); } public void guiResumed() { context.registerReceiver(receiver, new IntentFilter( OOBDApp.VISUALIZER_UPDATE)); } /** * Called by the ListView component for each DiagnoseListViewItem and * properly displays each {@link Visualizer}. Returns a View object that * represents a list row. * * @param position * The position of the item within the adapter's data set of the * item whose view we want. * @param convertView * The old view to reuse, if possible. Note: You should check * that this view is non-null and of an appropriate type before * using. If it is not possible to convert this view to display * the correct data, this method can create a new view. * @param parent * The parent that this view will eventually be attached to * @returns A View corresponding to the data at the specified position. */ @Override public View getView(int position, View convertView, ViewGroup parent) { // Visualizer item = null; try { final Visualizer item = getItem(position); if (item != null) { // do the item has its visual representation already? if (convertView != item.getReleatedObject()) { convertView = null; // force reconstruction } if (item.isTypeOf("TextEdit")) { // optimization: reuse diagnose items EditText functionValue; if (convertView == null) { // if there is no old view to reuse, a new one is // created // based on // layout diagnose_item convertView = mlayoutInflater.inflate( R.layout.diagnose_textedit_item, parent, false); item.setReleatedObject(convertView); functionValue = (EditText) convertView .findViewWithTag("value"); functionValue .setOnEditorActionListener(new OnEditorActionListener() { public boolean onEditorAction( TextView textView, int actionId, KeyEvent event) { String value = textView.getText() .toString(); boolean inputOk = (item.getRegex() == null || item .getRegex() .equalsIgnoreCase("")) || (value != null && value .matches(item .getRegex())); if (actionId == EditorInfo.IME_NULL && event.getAction() == KeyEvent.ACTION_DOWN) { if (inputOk) { textView.clearFocus(); item.inputNewValue(value); item.updateRequest(OOBDConstants.UR_USER); } return true; } return false; } }); // functionValue.setImeOptions(EditorInfo.IME_ACTION_DONE); functionValue.addTextChangedListener(new myTextWatcher( functionValue) { public void beforeTextChanged(CharSequence s, int start, int count, int after) { } public void onTextChanged(CharSequence s, int start, int before, int count) { } public void afterTextChanged(Editable v) { String value = myEditView.getText().toString(); boolean inputOk = (item.getRegex() == null || item .getRegex().equalsIgnoreCase("")) || (value != null && value.matches(item .getRegex())); if (inputOk) { myEditView.setTextColor(Color.GREEN); } else { myEditView.setTextColor(Color.RED); } } }); } functionValue = (EditText) convertView .findViewWithTag("value"); functionValue.setText(item.toString()); TextView functionName = (TextView) convertView .findViewWithTag("name"); functionName.setText(item.getToolTip()); /* * } else if (item.isTypeOf("CheckBox")) { */ } else if (item.isTypeOf("Slider")) { // optimization: reuse diagnose items SeekBar functionValue; if (convertView == null) { // if there is no old view to reuse, a new one is // created // based on // layout diagnose_item convertView = mlayoutInflater.inflate( R.layout.diagnose_slider_item, parent, false); item.setReleatedObject(convertView); functionValue = (SeekBar) convertView .findViewWithTag("value"); functionValue.setMax(item.getMax()); functionValue .setOnSeekBarChangeListener(new OnSeekBarChangeListener() { public void onProgressChanged( SeekBar seekBar, int progress, boolean fromUser) { item.inputNewValue(progress); item.updateRequest(OOBDConstants.UR_USER); } public void onStartTrackingTouch( SeekBar arg0) { // TODO Auto-generated method stub } public void onStopTrackingTouch(SeekBar arg0) { // TODO Auto-generated method stub } }); } functionValue = (SeekBar) convertView .findViewWithTag("value"); functionValue.setProgress(Visualizer.safeInt(item .toString())); TextView functionName = (TextView) convertView .findViewWithTag("name"); functionName.setText(item.getToolTip()); /* * } else if (item.isTypeOf("Combo")) { */ } else if (item.isTypeOf("Checkbox")) { // optimization: reuse diagnose items CheckBox functionValue; if (convertView == null) { // if there is no old view to reuse, a new one is // created // based on // layout diagnose_item convertView = mlayoutInflater.inflate( R.layout.diagnose_checkbox_item, parent, false); item.setReleatedObject(convertView); functionValue = (CheckBox) convertView .findViewWithTag("value"); functionValue.setText(item.getToolTip()); functionValue.setSelected(Boolean.valueOf(item .toString())); functionValue .setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { public void onCheckedChanged( CompoundButton buttonView, boolean isChecked) { item.inputNewValue(Boolean.valueOf( buttonView.isChecked()) .toString()); item.updateRequest(OOBDConstants.UR_USER); } }); } functionValue = (CheckBox) convertView .findViewWithTag("value"); functionValue.setSelected(Boolean.valueOf(item.toString())); TextView functionName = (TextView) convertView .findViewWithTag("name"); functionName.setText(item.getToolTip()); } else if (item.isTypeOf("Combo")) { // optimization: reuse diagnose items Spinner functionValue; if (convertView == null) { // if there is no old view to reuse, a new one is // created // based on // layout diagnose_item convertView = mlayoutInflater.inflate( R.layout.diagnose_combobox_item, parent, false); item.setReleatedObject(convertView); functionValue = (Spinner) convertView .findViewWithTag("value"); try { Onion items = (Onion) item .getValueOnion("opts/content"); Vector<String> al = new Vector<String>(); Vector<Integer> keylist = new Vector<Integer>(); Iterator<String> itr = items.keys(); while (itr.hasNext()) { Object element = itr.next(); keylist.add(Double.valueOf(element.toString()) .intValue()); } Enumeration<Integer> enumeration = keylist .elements(); List<Integer> list = Collections.list(enumeration); Collections.sort(list); for (Integer number : list) { al.add((String) items.get(((Double) number .doubleValue()).toString())); } @SuppressWarnings({ "unchecked", "rawtypes" }) ArrayAdapter<String[]> adapter = new ArrayAdapter( convertView.getContext(), android.R.layout.simple_spinner_item, al.toArray(new String[al.size()])); functionValue.setAdapter(adapter); } catch (JSONException ex) { // Logger.getLogger(convertView.class.getName()).log(Level.SEVERE, // null, ex); } functionValue .setOnItemSelectedListener(new OnItemSelectedListener() { public void onItemSelected( AdapterView<?> arg0, View view, int pos, long id) { item.inputNewValue(Integer .toString(pos)); item.updateRequest(OOBDConstants.UR_USER); } public void onNothingSelected( AdapterView<?> arg0) { // TODO Auto-generated method stub } }); } functionValue = (Spinner) convertView .findViewWithTag("value"); functionValue.setSelection(Visualizer.safeInt(item .toString())); TextView functionName = (TextView) convertView .findViewWithTag("name"); functionName.setText(item.getToolTip()); } else if (item.isTypeOf("Gauge")) { // optimization: reuse diagnose items ProgressBar functionValue; if (convertView == null) { // if there is no old view to reuse, a new one is // created // based on // layout diagnose_item convertView = mlayoutInflater.inflate( R.layout.diagnose_gauge_item, parent, false); item.setReleatedObject(convertView); functionValue = (ProgressBar) convertView .findViewWithTag("value"); functionValue.setMax(item.getMax()); functionValue.setProgress(Visualizer.safeInt(item .toString())); } functionValue = (ProgressBar) convertView .findViewWithTag("value"); functionValue.setProgress(Visualizer.safeInt(item .toString())); TextView functionName = (TextView) convertView .findViewWithTag("name"); functionName.setText(item.getToolTip()); /* * } else if (item.isTypeOf("Combo")) { */ } else { // default label // optimization: reuse diagnose items TextView functionValue; if (convertView == null) { // if there is no old view to reuse, a new one is // created // based on // layout diagnose_item convertView = mlayoutInflater.inflate( R.layout.diagnose_item, parent, false); item.setReleatedObject(convertView); } functionValue = (TextView) convertView .findViewWithTag("value"); functionValue.setText(item.toString()); functionValue.setText(item.toString()); TextView functionName = (TextView) convertView .findViewWithTag("name"); functionName.setText(item.getToolTip()); } } if (item != null) { if (item.getUpdateFlag(4)) { ((ImageView) convertView.findViewWithTag("back")) .setImageBitmap(myIcons[OOBDConstants.VE_BACK + 1]); } else { ((ImageView) convertView.findViewWithTag("back")) .setImageBitmap(myIcons[0]); } if (item.getUpdateFlag(1)) { ((ImageView) convertView.findViewWithTag("update")) .setImageBitmap(myIcons[OOBDConstants.VE_UPDATE + 1]); } else { ((ImageView) convertView.findViewWithTag("update")) .setImageBitmap(myIcons[0]); } if (item.getUpdateFlag(2)) { ((ImageView) convertView.findViewWithTag("timer")) .setImageBitmap(myIcons[OOBDConstants.VE_TIMER + 1]); } else { ((ImageView) convertView.findViewWithTag("timer")) .setImageBitmap(myIcons[0]); } if (item.getUpdateFlag(3)) { ((ImageView) convertView.findViewWithTag("log")) .setImageBitmap(myIcons[OOBDConstants.VE_LOG + 1]); } else { ((ImageView) convertView.findViewWithTag("log")) .setImageBitmap(myIcons[0]); } if (item.getUpdateFlag(0)) { ((ImageView) convertView.findViewWithTag("forward")) .setImageBitmap(myIcons[OOBDConstants.VE_MENU + 1]); } else { ((ImageView) convertView.findViewWithTag("forward")) .setImageBitmap(myIcons[0]); } } } catch (Exception ex) { Logger.getLogger(DiagnoseAdapter.class.getName()).log( Level.WARNING, null, ex); } return convertView; } } abstract class myTextWatcher implements TextWatcher { EditText myEditView; myTextWatcher(EditText myView) { super(); myEditView = myView; } }