Using locale settings to detect wheter to use imperial units
LocaleData.getMeasurementSystem is available from API level 28 and beyond. It returns the information you are looking for.
In the end I went for the following solution.
public class UnitLocale {
public static UnitLocale Imperial = new UnitLocale();
public static UnitLocale Metric = new UnitLocale();
public static UnitLocale getDefault() {
return getFrom(Locale.getDefault());
}
public static UnitLocale getFrom(Locale locale) {
String countryCode = locale.getCountry();
if ("US".equals(countryCode)) return Imperial; // USA
if ("LR".equals(countryCode)) return Imperial; // Liberia
if ("MM".equals(countryCode)) return Imperial; // Myanmar
return Metric;
}
}
Use it like this for example.
if (UnitLocale.getDefault() == UnitLocale.Imperial) convertToimperial();
If convert methods are also need they can preferably be added to subclasses of UnitLocale. I only needed to detect wheter to use imperial units and send it to the server.
Using int
s over java objects have extremely slim performance gains and makes the code harder to read. Comparing two references in java is comparable in speed to comparing two ints
. Also using objects allow us to add methods to the UnitLocale
class or subclasses such as, convertToMetric, etc.
You could also use an enum instead if you prefer that.