package org.droidplanner.android.dialogs.parameters; import java.text.DecimalFormat; import java.util.ArrayList; import java.util.List; import java.util.Map; import org.droidplanner.android.R; import org.droidplanner.android.view.adapterViews.ParamsAdapterItem; import android.content.Context; import android.content.DialogInterface; import android.support.v7.app.AlertDialog; import android.view.LayoutInflater; import android.view.View; import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.EditText; import android.widget.Spinner; import android.widget.TextView; import com.o3dr.services.android.lib.drone.property.Parameter; public class DialogParameterInfo { private final static DecimalFormat formatter = (DecimalFormat) DecimalFormat.getInstance(); static { formatter.applyPattern("0.###"); } public static AlertDialog build(ParamsAdapterItem item, EditText valueView, Context context) { final View view = buildView(item, context); final AlertDialog dialog = new AlertDialog.Builder(context).setView(view).create(); dialog.setCanceledOnTouchOutside(true); // spinner's onItemSelcted impl needs ref to Dialog interface buildValueSpinner(dialog, view, item.getParameter(), valueView, context); return dialog; } private static View buildView(ParamsAdapterItem item, Context context) { final LayoutInflater inflater = LayoutInflater.from(context); final View view = inflater.inflate(R.layout.fragment_parameters_info, null); final Parameter parameter = item.getParameter(); setTextView(view, R.id.displayNameView, parameter.getDisplayName()); setTextView(view, R.id.nameView, parameter.getName()); setTextView(view, R.id.descView, parameter.getDescription()); setTextLayout(view, R.id.unitsLayout, R.id.unitsView, parameter.getUnits()); setTextLayout(view, R.id.rangeLayout, R.id.rangeView, formatRange(parameter.getRange())); setTextLayout(view, R.id.valuesLayout, R.id.valuesView, parameter.getValues()); return view; } private static String formatRange(String range) { if (range == null || range.isEmpty()) return null; final String[] part = range.split(" "); if (part.length == 2) return part[0] + " / " + part[1]; else return range; } private static void setTextView(View view, int ridTextView, String text) { final TextView textView = (TextView) view.findViewById(ridTextView); if (text != null) { textView.setText(text); } else { textView.setVisibility(View.GONE); } } private static void setTextLayout(View view, int ridLayout, int ridTextView, String text) { if (text != null) { final TextView textView = (TextView) view.findViewById(ridTextView); textView.setText(text); } else { view.findViewById(ridLayout).setVisibility(View.GONE); } } private static void buildValueSpinner(final DialogInterface dialogInterface, View view, Parameter parameter, final EditText valueView, Context context) { // bail if nothing to do if (parameter.getValues() == null) return; try { final Map<Double, String> valueMap = parameter.parseValues(); final List<Double> values = new ArrayList<Double>(valueMap.keySet()); final List<String> strings = new ArrayList<String>(); // get current dirty value final double dirtyValue = formatter.parse(valueView.getText().toString()).doubleValue(); // build value / string collections int position = values.indexOf(dirtyValue); if (position == -1) { // not found: add 'custom value' position = 0; values.add(position, dirtyValue); strings.add(String.format("%s: %s", formatter.format(dirtyValue), context .getResources().getString(R.string.metadata_custom_value))); } for (Map.Entry<Double, String> entry : valueMap.entrySet()) strings.add(String.format("%s: %s", formatter.format(entry.getKey()), entry.getValue())); // build adapter final ArrayAdapter<String> adapter = new ArrayAdapter<String>(context, R.layout.spinner_param_value_item, strings); adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); // setup spinner final Spinner valueSpinner = (Spinner) view.findViewById(R.id.valueSpinner); valueSpinner.setAdapter(adapter); valueSpinner.setSelection(position); valueSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { boolean once = true; @Override public void onItemSelected(AdapterView<?> adapterView, View view, int position, long id) { valueView.setText(formatter.format(values.get(position))); if (once) once = false; else dialogInterface.dismiss(); } @Override public void onNothingSelected(AdapterView<?> adapterView) { // nop } }); } catch (Exception e) { // can't populate spinner - remove it view.findViewById(R.id.valueSpinnerView).setVisibility(View.GONE); view.findViewById(R.id.valueTextView).setVisibility(View.VISIBLE); } } }