package org.droidplanner.android.view.adapterViews;
import android.os.Parcel;
import android.os.Parcelable;
import com.o3dr.services.android.lib.drone.property.Parameter;
import java.text.DecimalFormat;
import java.text.ParseException;
import java.util.Map;
/**
* Date: 2013-12-09 Time: 1:32 AM
*/
public class ParamsAdapterItem implements Parcelable {
public enum Validation {
NA, INVALID, VALID
}
private final static DecimalFormat formatter = (DecimalFormat) DecimalFormat.getInstance();
static {
formatter.applyPattern("0.###");
}
private Parameter parameter;
private String dirtyValue;
private Validation validation;
public ParamsAdapterItem(Parameter parameter) {
this.parameter = parameter;
}
public Parameter getParameter() {
if (dirtyValue == null)
return parameter;
try {
final double dval = formatter.parse(dirtyValue).doubleValue();
Parameter copy = new Parameter(parameter.getName(), dval, parameter.getType());
copy.setDescription(parameter.getDescription());
copy.setUnits(parameter.getUnits());
copy.setDisplayName(parameter.getDisplayName());
copy.setRange(parameter.getRange());
copy.setValues(parameter.getValues());
return copy;
} catch (ParseException e) {
return parameter;
}
}
public void setDirtyValue(String value) {
setDirtyValue(value, false);
}
public void setDirtyValue(String value, boolean force){
if(force){
dirtyValue = value;
}
else{
// dirty if different from original value, set validation if dirty
dirtyValue = (parameter.getDisplayValue().equals(value)) ? null : value;
}
if (dirtyValue != null)
validation = validateValue(dirtyValue);
}
public void commit() {
try {
parameter.setValue(formatter.parse(dirtyValue).doubleValue());
dirtyValue = null;
} catch (ParseException e) {
// nop
}
}
public boolean isDirty() {
return dirtyValue != null;
}
public Validation getValidation() {
return validation;
}
private Validation validateValue(String value) {
if (parameter.getRange() != null) {
return validateInRange(value);
} else if (parameter.getValues() != null) {
return validateInValues(value);
} else {
return Validation.NA;
}
}
private Validation validateInRange(String value) {
try {
final double dval = formatter.parse(value).doubleValue();
final double[] range = parameter.parseRange();
return (dval >= range[Parameter.RANGE_LOW] && dval <= range[Parameter.RANGE_HIGH])
? Validation.VALID
: Validation.INVALID;
} catch (ParseException ex) {
return Validation.NA;
}
}
private Validation validateInValues(String value) {
try {
final double dval = formatter.parse(value).doubleValue();
final Map<Double, String> values = parameter.parseValues();
if (values.keySet().contains(dval)) {
return Validation.VALID;
} else {
return Validation.INVALID;
}
} catch (ParseException ex) {
return Validation.NA;
}
}
@Override
public String toString(){
String toString = "";
final Parameter param = getParameter();
if (param != null) {
toString = param.getName() + ": ";
toString += parameter.getDisplayName();
}
return toString;
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeParcelable(this.parameter, 0);
dest.writeString(this.dirtyValue);
dest.writeInt(this.validation == null ? -1 : this.validation.ordinal());
}
private ParamsAdapterItem(Parcel in) {
this.parameter = in.readParcelable(Parameter.class.getClassLoader());
this.dirtyValue = in.readString();
int tmpValidation = in.readInt();
this.validation = tmpValidation == -1 ? null : Validation.values()[tmpValidation];
}
public static final Creator<ParamsAdapterItem> CREATOR = new Creator<ParamsAdapterItem>() {
public ParamsAdapterItem createFromParcel(Parcel source) {
return new ParamsAdapterItem(source);
}
public ParamsAdapterItem[] newArray(int size) {
return new ParamsAdapterItem[size];
}
};
}