diff --git a/app/src/main/java/com/natalieperna/cupful/activities/MainActivity.java b/app/src/main/java/com/natalieperna/cupful/activities/MainActivity.java index 329db6a..4477401 100644 --- a/app/src/main/java/com/natalieperna/cupful/activities/MainActivity.java +++ b/app/src/main/java/com/natalieperna/cupful/activities/MainActivity.java @@ -6,16 +6,15 @@ import android.view.KeyEvent; import android.view.View; import android.widget.AdapterView; -import android.widget.ArrayAdapter; import android.widget.EditText; import android.widget.Spinner; import androidx.appcompat.app.AppCompatActivity; import com.natalieperna.cupful.R; +import com.natalieperna.cupful.adapters.UnitAdapter; import com.natalieperna.cupful.data.IngredientReader; import com.natalieperna.cupful.data.Units; -import com.natalieperna.cupful.models.DisplayUnit; import com.natalieperna.cupful.models.Ingredient; import com.natalieperna.cupful.views.IngredientSpinner; @@ -120,8 +119,7 @@ private void setupSpinners() { ingredientInput.setIngredients(ingredientReader.getAll()); // Show units in spinners - ArrayAdapter unitAdapter = new ArrayAdapter<>(this, android.R.layout.simple_spinner_item, Units.getAll()); - unitAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); + UnitAdapter unitAdapter = new UnitAdapter(this, Units.getAll()); topUnit.setAdapter(unitAdapter); bottomUnit.setAdapter(unitAdapter); @@ -224,8 +222,8 @@ private void convert(boolean forward) { // Get ingredients and units Ingredient ingredient = (Ingredient) ingredientInput.getSelectedItem(); - Unit fromUnit = ((DisplayUnit) fromUnitSpinner.getSelectedItem()).getUnit(); - Unit toUnit = ((DisplayUnit) toUnitSpinner.getSelectedItem()).getUnit(); + Unit fromUnit = (Unit) fromUnitSpinner.getSelectedItem(); + Unit toUnit = (Unit) toUnitSpinner.getSelectedItem(); // Get from value String fromString = fromInput.getText().toString(); diff --git a/app/src/main/java/com/natalieperna/cupful/adapters/UnitAdapter.java b/app/src/main/java/com/natalieperna/cupful/adapters/UnitAdapter.java new file mode 100644 index 0000000..33787ae --- /dev/null +++ b/app/src/main/java/com/natalieperna/cupful/adapters/UnitAdapter.java @@ -0,0 +1,70 @@ +package com.natalieperna.cupful.adapters; + +import android.content.Context; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.BaseAdapter; +import android.widget.TextView; + +import androidx.annotation.LayoutRes; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + +import com.natalieperna.cupful.data.Units; + +import java.util.List; + +import javax.measure.quantity.Quantity; +import javax.measure.unit.Unit; + +public class UnitAdapter extends BaseAdapter { + private final LayoutInflater inflater; + private final List> units; + + public UnitAdapter(@NonNull Context context, List> units) { + super(); + this.inflater = LayoutInflater.from(context); + this.units = units; + } + + @Override + public int getCount() { + return units.size(); + } + + @Override + public Object getItem(int position) { + return units.get(position); + } + + @Override + public long getItemId(int position) { + return position; + } + + @NonNull + @Override + public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) { + return constructView(position, convertView, parent, android.R.layout.simple_spinner_item); + } + + @Override + public View getDropDownView(int position, @Nullable View convertView, @NonNull ViewGroup parent) { + return constructView(position, convertView, parent, android.R.layout.simple_spinner_dropdown_item); + } + + private View constructView(int position, @Nullable View convertView, @NonNull ViewGroup parent, @LayoutRes int resource) { + TextView view; + if (convertView == null) { + view = (TextView) inflater.inflate(resource, parent, false); + } else { + view = (TextView) convertView; + } + + Unit unit = (Unit) getItem(position); + view.setText(Units.unitToString(unit)); + + return view; + } +} diff --git a/app/src/main/java/com/natalieperna/cupful/data/Units.java b/app/src/main/java/com/natalieperna/cupful/data/Units.java index d97da21..a39a36d 100644 --- a/app/src/main/java/com/natalieperna/cupful/data/Units.java +++ b/app/src/main/java/com/natalieperna/cupful/data/Units.java @@ -1,7 +1,9 @@ package com.natalieperna.cupful.data; -import com.natalieperna.cupful.models.DisplayUnit; +import java.util.List; +import java.util.Map; +import javax.measure.quantity.Quantity; import javax.measure.quantity.Volume; import javax.measure.quantity.VolumetricDensity; import javax.measure.unit.NonSI; @@ -20,24 +22,46 @@ public class Units { // Density unit public static final Unit G_PER_CUP = SI.GRAM.divide(CUP_US).asType(VolumetricDensity.class); - private static final DisplayUnit[] UNITS = { - new DisplayUnit<>(CUP_US, "cup (US)"), - new DisplayUnit<>(TABLESPOON_US, "tbsp (US)"), - new DisplayUnit<>(TEASPOON_US, "tsp (US)"), - new DisplayUnit<>(SI.GRAM, "g"), - new DisplayUnit<>(SI.KILOGRAM, "kg"), - new DisplayUnit<>(NonSI.OUNCE, "oz"), - new DisplayUnit<>(NonSI.POUND, "lb"), - new DisplayUnit<>(SI.MILLI(NonSI.LITER), "mL"), - new DisplayUnit<>(NonSI.LITER, "L"), - new DisplayUnit<>(NonSI.OUNCE_LIQUID_US, "fl oz (US)"), - new DisplayUnit<>(CUP_UK, "cup (UK)"), - new DisplayUnit<>(TABLESPOON_UK, "tbsp (UK)"), - new DisplayUnit<>(TEASPOON_UK, "tsp (UK)"), - new DisplayUnit<>(NonSI.OUNCE_LIQUID_UK, "fl oz (UK)"), - }; - - public static DisplayUnit[] getAll() { + /** + * List of all units available for conversion + */ + private static final List> UNITS = List.of( + CUP_US, + TABLESPOON_US, + TEASPOON_US, + SI.GRAM, + SI.KILOGRAM, + NonSI.OUNCE, + NonSI.POUND, + SI.MILLI(NonSI.LITER), + NonSI.LITER, + NonSI.OUNCE_LIQUID_US, + CUP_UK, + TABLESPOON_UK, + TEASPOON_UK, + NonSI.OUNCE_LIQUID_UK + ); + + public static List> getAll() { return UNITS; } + + /** + * Custom string representation for some {@link #UNITS}, otherwise use {@link Unit#toString()} + */ + private static final Map, String> UNIT_TO_STRING_OVERRIDE = Map.ofEntries( + Map.entry(CUP_US, "cup (US)"), + Map.entry(TABLESPOON_US, "tbsp (US)"), + Map.entry(TEASPOON_US, "tsp (US)"), + Map.entry(NonSI.OUNCE_LIQUID_US, "fl oz (US)"), + Map.entry(CUP_UK, "cup (UK)"), + Map.entry(TABLESPOON_UK, "tbsp (UK)"), + Map.entry(TEASPOON_UK, "tsp (UK)"), + Map.entry(NonSI.OUNCE_LIQUID_UK, "fl oz (UK)") + ); + + public static String unitToString(Unit unit) { + String s = UNIT_TO_STRING_OVERRIDE.get(unit); + return s == null ? unit.toString() : s; + } } diff --git a/app/src/main/java/com/natalieperna/cupful/models/DisplayUnit.java b/app/src/main/java/com/natalieperna/cupful/models/DisplayUnit.java deleted file mode 100644 index a121ea3..0000000 --- a/app/src/main/java/com/natalieperna/cupful/models/DisplayUnit.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.natalieperna.cupful.models; - -import javax.measure.quantity.Quantity; -import javax.measure.unit.Unit; - -public class DisplayUnit { - private final Unit unit; - private final String name; - - public DisplayUnit(Unit unit, String name) { - this.unit = unit; - this.name = name; - } - - public Unit getUnit() { - return unit; - } - - @Override - public String toString() { - return name; - } -}