Initial commit

This commit is contained in:
serso 2016-04-14 00:30:55 +02:00
parent ea3c236a3a
commit 8f640ecb33

View File

@ -27,6 +27,7 @@ import org.solovyev.android.calculator.*;
import javax.annotation.Nonnull; import javax.annotation.Nonnull;
import javax.inject.Inject; import javax.inject.Inject;
import javax.measure.converter.UnitConverter;
import javax.measure.unit.NonSI; import javax.measure.unit.NonSI;
import javax.measure.unit.SI; import javax.measure.unit.SI;
import javax.measure.unit.Unit; import javax.measure.unit.Unit;
@ -39,7 +40,7 @@ public class ConverterFragment extends BaseDialogFragment
@NonNull @NonNull
private static final Set<String> excludedUnits = new HashSet<>(Arrays.asList("year_sidereal", "year_calendar", "day_sidereal", "foot_survey_us", "me", "u")); private static final Set<String> excludedUnits = new HashSet<>(Arrays.asList("year_sidereal", "year_calendar", "day_sidereal", "foot_survey_us", "me", "u"));
@NonNull @NonNull
private static final Map<NamedDimension, List<Unit<?>>> units = new HashMap<>(); private static final Map<NamedDimension, List<MyUnit>> units = new HashMap<>();
private static final String STATE_SELECTION_FROM = "selection.from"; private static final String STATE_SELECTION_FROM = "selection.from";
private static final String STATE_SELECTION_TO = "selection.to"; private static final String STATE_SELECTION_TO = "selection.to";
private static final String EXTRA_VALUE = "value"; private static final String EXTRA_VALUE = "value";
@ -75,8 +76,8 @@ public class ConverterFragment extends BaseDialogFragment
@Bind(R.id.converter_swap_button) @Bind(R.id.converter_swap_button)
ImageButton swapButton; ImageButton swapButton;
private ArrayAdapter<NamedItem<NamedDimension>> dimensionsAdapter; private ArrayAdapter<NamedItem<NamedDimension>> dimensionsAdapter;
private ArrayAdapter<NamedItem<Unit>> adapterFrom; private ArrayAdapter<NamedItem<MyUnit>> adapterFrom;
private ArrayAdapter<NamedItem<Unit>> adapterTo; private ArrayAdapter<NamedItem<MyUnit>> adapterTo;
private int pendingFromSelection = View.NO_ID; private int pendingFromSelection = View.NO_ID;
private int pendingToSelection = View.NO_ID; private int pendingToSelection = View.NO_ID;
@ -91,12 +92,12 @@ public class ConverterFragment extends BaseDialogFragment
return; return;
} }
List<Unit<?>> unitsInDimension = units.get(dimension); List<MyUnit> unitsInDimension = units.get(dimension);
if (unitsInDimension == null) { if (unitsInDimension == null) {
unitsInDimension = new ArrayList<>(); unitsInDimension = new ArrayList<>();
units.put(dimension, unitsInDimension); units.put(dimension, unitsInDimension);
} }
unitsInDimension.add(unit); unitsInDimension.add(MeasureUnit.create(unit));
} }
public static void show(@Nonnull FragmentActivity activity) { public static void show(@Nonnull FragmentActivity activity) {
@ -116,6 +117,11 @@ public class ConverterFragment extends BaseDialogFragment
return new ArrayAdapter<>(context, R.layout.support_simple_spinner_dropdown_item); return new ArrayAdapter<>(context, R.layout.support_simple_spinner_dropdown_item);
} }
@Nonnull
private static <T> NamedItem<T> createNamedItem(@NonNull T item, @StringRes int name, @NonNull Context context) {
return new NamedItem<>(item, name == 0 ? item.toString() : context.getString(name));
}
@Override @Override
protected void onPrepareDialog(@NonNull AlertDialog.Builder builder) { protected void onPrepareDialog(@NonNull AlertDialog.Builder builder) {
builder.setPositiveButton(R.string.c_use, null); builder.setPositiveButton(R.string.c_use, null);
@ -197,7 +203,7 @@ public class ConverterFragment extends BaseDialogFragment
} }
} }
private void onUnitFromChanged(@NonNull Unit<?> unit) { private void onUnitFromChanged(@NonNull MyUnit unit) {
final int dimensionPosition = dimensionsSpinner.getSelectedItemPosition(); final int dimensionPosition = dimensionsSpinner.getSelectedItemPosition();
updateUnitsTo(dimensionsAdapter.getItem(dimensionPosition).item, unit); updateUnitsTo(dimensionsAdapter.getItem(dimensionPosition).item, unit);
convert(); convert();
@ -212,8 +218,8 @@ public class ConverterFragment extends BaseDialogFragment
private void updateUnitsFrom(@NonNull NamedDimension dimension) { private void updateUnitsFrom(@NonNull NamedDimension dimension) {
adapterFrom.setNotifyOnChange(false); adapterFrom.setNotifyOnChange(false);
adapterFrom.clear(); adapterFrom.clear();
for (Unit unit : units.get(dimension)) { for (MyUnit unit : units.get(dimension)) {
adapterFrom.add(named(unit)); adapterFrom.add(unit.named(getActivity()));
} }
adapterFrom.sort(COMPARATOR); adapterFrom.sort(COMPARATOR);
adapterFrom.setNotifyOnChange(true); adapterFrom.setNotifyOnChange(true);
@ -222,8 +228,8 @@ public class ConverterFragment extends BaseDialogFragment
pendingFromSelection = View.NO_ID; pendingFromSelection = View.NO_ID;
} }
private void updateUnitsTo(@NonNull NamedDimension dimension, @NonNull Unit<?> except) { private void updateUnitsTo(@NonNull NamedDimension dimension, @NonNull MyUnit except) {
final Unit<?> selectedUnit; final MyUnit selectedUnit;
if (pendingToSelection > View.NO_ID) { if (pendingToSelection > View.NO_ID) {
selectedUnit = null; selectedUnit = null;
} else { } else {
@ -232,9 +238,9 @@ public class ConverterFragment extends BaseDialogFragment
} }
adapterTo.setNotifyOnChange(false); adapterTo.setNotifyOnChange(false);
adapterTo.clear(); adapterTo.clear();
for (Unit unit : units.get(dimension)) { for (MyUnit unit : units.get(dimension)) {
if (!except.equals(unit)) { if (!except.equals(unit)) {
adapterTo.add(named(unit)); adapterTo.add(unit.named(getActivity()));
} }
} }
adapterTo.sort(COMPARATOR); adapterTo.sort(COMPARATOR);
@ -242,7 +248,7 @@ public class ConverterFragment extends BaseDialogFragment
adapterTo.notifyDataSetChanged(); adapterTo.notifyDataSetChanged();
if (selectedUnit != null && !except.equals(selectedUnit)) { if (selectedUnit != null && !except.equals(selectedUnit)) {
for (int i = 0; i < adapterTo.getCount(); i++) { for (int i = 0; i < adapterTo.getCount(); i++) {
final Unit unit = adapterTo.getItem(i).item; final MyUnit unit = adapterTo.getItem(i).item;
if (unit.equals(selectedUnit)) { if (unit.equals(selectedUnit)) {
spinnerTo.setSelection(i); spinnerTo.setSelection(i);
return; return;
@ -253,15 +259,6 @@ public class ConverterFragment extends BaseDialogFragment
pendingToSelection = View.NO_ID; pendingToSelection = View.NO_ID;
} }
@Nonnull
private NamedItem<Unit> named(@Nonnull Unit unit) {
final NamedDimension dimension = NamedDimension.of(unit);
if (dimension == null) {
return createNamedItem(unit, 0);
}
return createNamedItem(unit, Converter.unitName(unit, dimension));
}
@Override @Override
public void onNothingSelected(AdapterView<?> parent) { public void onNothingSelected(AdapterView<?> parent) {
} }
@ -293,11 +290,11 @@ public class ConverterFragment extends BaseDialogFragment
} }
try { try {
final Double fromValue = parseDouble(value); final MyUnit from = adapterFrom.getItem(spinnerFrom.getSelectedItemPosition()).item;
final Unit<?> from = adapterFrom.getItem(spinnerFrom.getSelectedItemPosition()).item; final Object fromValue = from.parse(value);
final Unit<?> to = adapterTo.getItem(spinnerTo.getSelectedItemPosition()).item; final MyUnit to = adapterTo.getItem(spinnerTo.getSelectedItemPosition()).item;
final double toValue = from.getConverterTo(to).convert(fromValue); final Object toValue = from.getConverterTo(to).convert(fromValue);
editTextTo.setText(formatDouble(toValue)); editTextTo.setText(to.format(toValue));
clearError(labelFrom); clearError(labelFrom);
} catch (RuntimeException e) { } catch (RuntimeException e) {
if (validate) { if (validate) {
@ -306,20 +303,6 @@ public class ConverterFragment extends BaseDialogFragment
} }
} }
private double parseDouble(@Nonnull String value) {
final String groupingSeparator = String.valueOf(JsclMathEngine.getInstance().getGroupingSeparator());
if (!TextUtils.isEmpty(groupingSeparator)) {
value = value.replace(groupingSeparator, "");
}
final long bits = new Real(value).toDoubleBits();
return Double.longBitsToDouble(bits);
}
@Nonnull
private String formatDouble(double toValue) {
return JsclMathEngine.getInstance().format(toValue, NumeralBase.dec);
}
@Override @Override
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
switch (v.getId()) { switch (v.getId()) {
@ -354,14 +337,13 @@ public class ConverterFragment extends BaseDialogFragment
} }
final String text = editTextTo.getText().toString(); final String text = editTextTo.getText().toString();
try { try {
final double value = parseDouble(text);
switch (which) { switch (which) {
case DialogInterface.BUTTON_POSITIVE: case DialogInterface.BUTTON_POSITIVE:
editor.insert(String.valueOf(value)); editor.insert(text);
dismiss(); dismiss();
break; break;
case DialogInterface.BUTTON_NEUTRAL: case DialogInterface.BUTTON_NEUTRAL:
clipboard.setText(String.valueOf(value)); clipboard.setText(text);
Toast.makeText(getActivity(), getString(R.string.c_result_copied), Toast.makeText(getActivity(), getString(R.string.c_result_copied),
Toast.LENGTH_SHORT).show(); Toast.LENGTH_SHORT).show();
break; break;
@ -372,13 +354,13 @@ public class ConverterFragment extends BaseDialogFragment
private void swap() { private void swap() {
editTextFrom.setText(editTextTo.getText()); editTextFrom.setText(editTextTo.getText());
final Unit<?> oldFromUnit = adapterFrom.getItem(spinnerFrom.getSelectedItemPosition()).item; final MyUnit oldFromUnit = adapterFrom.getItem(spinnerFrom.getSelectedItemPosition()).item;
final Unit<?> oldToUnit = adapterTo.getItem(spinnerTo.getSelectedItemPosition()).item; final MyUnit oldToUnit = adapterTo.getItem(spinnerTo.getSelectedItemPosition()).item;
pendingToSelection = -1; pendingToSelection = -1;
for (int i = 0; i < adapterFrom.getCount(); i++) { for (int i = 0; i < adapterFrom.getCount(); i++) {
pendingToSelection++; pendingToSelection++;
final Unit<?> unit = adapterFrom.getItem(i).item; final MyUnit unit = adapterFrom.getItem(i).item;
if (unit.equals(oldToUnit)) { if (unit.equals(oldToUnit)) {
pendingToSelection--; pendingToSelection--;
} else if (unit.equals(oldFromUnit)) { } else if (unit.equals(oldFromUnit)) {
@ -387,7 +369,7 @@ public class ConverterFragment extends BaseDialogFragment
} }
for (int i = 0; i < adapterFrom.getCount(); i++) { for (int i = 0; i < adapterFrom.getCount(); i++) {
final Unit<?> unit = adapterFrom.getItem(i).item; final MyUnit unit = adapterFrom.getItem(i).item;
if (unit.equals(oldToUnit)) { if (unit.equals(oldToUnit)) {
spinnerFrom.setSelection(i); spinnerFrom.setSelection(i);
break; break;
@ -418,7 +400,25 @@ public class ConverterFragment extends BaseDialogFragment
@Nonnull @Nonnull
private <T> NamedItem<T> createNamedItem(@NonNull T item, @StringRes int name) { private <T> NamedItem<T> createNamedItem(@NonNull T item, @StringRes int name) {
return new NamedItem<>(item, name == 0 ? item.toString() : getString(name)); return createNamedItem(item, name, getActivity());
}
private interface MyUnit {
@NonNull
Object parse(@NonNull String value);
@NonNull
String format(@NonNull Object value);
@NonNull
MyConverter getConverterTo(@NonNull MyUnit to);
@NonNull
NamedItem<MyUnit> named(@NonNull Context context);
}
private interface MyConverter {
Object convert(Object value);
} }
private static class NamedItem<T> { private static class NamedItem<T> {
@ -438,10 +438,82 @@ public class ConverterFragment extends BaseDialogFragment
} }
} }
private static class NamedItemComparator implements Comparator<NamedItem<Unit>> { private static class NamedItemComparator implements Comparator<NamedItem<MyUnit>> {
@Override @Override
public int compare(NamedItem<Unit> lhs, NamedItem<Unit> rhs) { public int compare(NamedItem<MyUnit> lhs, NamedItem<MyUnit> rhs) {
return lhs.toString().compareTo(rhs.toString()); return lhs.toString().compareTo(rhs.toString());
} }
} }
private static final class MeasureUnit implements MyUnit {
@NonNull
final Unit unit;
private MeasureUnit(@NonNull Unit unit) {
this.unit = unit;
}
private static MeasureUnit create(@NonNull Unit unit) {
return new MeasureUnit(unit);
}
@Override
public String toString() {
return unit.toString();
}
@NonNull
@Override
public Object parse(@NonNull String value) {
final String groupingSeparator = String.valueOf(JsclMathEngine.getInstance().getGroupingSeparator());
if (!TextUtils.isEmpty(groupingSeparator)) {
value = value.replace(groupingSeparator, "");
}
final long bits = new Real(value).toDoubleBits();
return Double.longBitsToDouble(bits);
}
@NonNull
@Override
public String format(@NonNull Object value) {
return JsclMathEngine.getInstance().format((Double) value, NumeralBase.dec);
}
@NonNull
@Override
public MyConverter getConverterTo(@NonNull final MyUnit to) {
return new MyConverter() {
@Override
public Object convert(Object value) {
final UnitConverter converter = unit.getConverterTo(((MeasureUnit) to).unit);
return converter.convert((Double) value);
}
};
}
@NonNull
@Override
public NamedItem<MyUnit> named(@Nonnull Context context) {
final NamedDimension dimension = NamedDimension.of(unit);
if (dimension == null) {
return createNamedItem((MyUnit) MeasureUnit.create(unit), 0, context);
}
return createNamedItem((MyUnit) MeasureUnit.create(unit), Converter.unitName(unit, dimension), context);
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
final MeasureUnit that = (MeasureUnit) o;
return unit.equals(that.unit);
}
@Override
public int hashCode() {
return unit.hashCode();
}
}
} }