package org.schmivits.airball.dataproxy.view; import tw.com.prolific.driver.pl2303.PL2303Driver.BaudRate; import tw.com.prolific.driver.pl2303.PL2303Driver.DataBits; import tw.com.prolific.driver.pl2303.PL2303Driver.FlowControl; import tw.com.prolific.driver.pl2303.PL2303Driver.Parity; import tw.com.prolific.driver.pl2303.PL2303Driver.StopBits; import android.content.Context; import android.util.AttributeSet; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.AdapterView.OnItemSelectedListener; import android.widget.ArrayAdapter; import android.widget.Spinner; import android.widget.SpinnerAdapter; import org.schmivits.airball.dataproxy.R; import org.schmivits.airball.dataproxy.data.ActualDataSourceStream; import org.schmivits.airball.dataproxy.data.ActualDataSourceStream.SerialParameters; public class ActualDataSourceStreamView extends ProcessNodeView { private EnumModel<BaudRate> mBaudRate; private EnumModel<DataBits> mDataBits; private EnumModel<StopBits> mStopBits; private EnumModel<Parity> mParity; private EnumModel<FlowControl> mFlowControl; class EnumModel<T extends Enum<?>> { private final Class<T> mClazz; private final Spinner mSpinner; public EnumModel(Class<T> clazz, int id, T selected) { mClazz = clazz; mSpinner = (Spinner) findViewById(id); mSpinner.setAdapter((SpinnerAdapter) new ArrayAdapter<Object>( getContext(), R.layout.serial_parameter_item, mClazz.getEnumConstants())); mSpinner.setOnItemSelectedListener(new OnItemSelectedListener() { @Override public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) { updateFromSpinners(); } @Override public void onNothingSelected(AdapterView<?> parent) { updateFromSpinners(); } }); set(selected); } public T get() { return mClazz.getEnumConstants()[mSpinner.getSelectedItemPosition()]; } public void set(T value) { T[] constants = mClazz.getEnumConstants(); for (int i = 0; i < constants.length; i++) { if (value == constants[i]) { mSpinner.setSelection(i); return; } } } } private <Q extends Enum<?>> EnumModel<Q> make(Class<Q> clazz, int id, Q selected) { return new EnumModel<Q>(clazz, id, selected); } public ActualDataSourceStreamView(Context context, AttributeSet attrs) { this(null, context, attrs); } public ActualDataSourceStreamView(ActualDataSourceStream model, Context context, AttributeSet attrs) { super(model, context, attrs); } @Override protected void addAdditional(ViewGroup parent) { LayoutInflater.from(getContext()).inflate( R.layout.actual_data_source, parent); SerialParameters sp = ((ActualDataSourceStream) getModel()).getSerialParameters(); mBaudRate = make(BaudRate.class, R.id.actual_data_source_baud_rate, sp.mBaudRate); mDataBits = make(DataBits.class, R.id.actual_data_source_data_bits, sp.mDataBits); mStopBits = make(StopBits.class, R.id.actual_data_source_stop_bits, sp.mStopBits); mParity = make(Parity.class, R.id.actual_data_source_parity, sp.mParity); mFlowControl = make(FlowControl.class, R.id.actual_data_source_flow_control, sp.mFlowControl); } private void updateFromSpinners() { ((ActualDataSourceStream) getModel()).setSerialParameters( new ActualDataSourceStream.SerialParameters( mBaudRate.get(), mDataBits.get(), mStopBits.get(), mParity.get(), mFlowControl.get())); } }