Implement SpeedFormatter.

This commit is contained in:
Dennis Guse
2022-04-24 16:51:31 +02:00
parent 16f238f34b
commit db5c9479df
10 changed files with 220 additions and 85 deletions
@@ -0,0 +1,103 @@
package de.dennisguse.opentracks.data.models;
import android.content.Context;
import android.content.res.Resources;
import android.util.Pair;
import de.dennisguse.opentracks.R;
import de.dennisguse.opentracks.util.StringUtils;
public class SpeedFormatter {
private final Resources resources;
private final int decimalCount;
private final boolean metricUnits;
private final boolean reportSpeedOrPace;
private SpeedFormatter(Resources resources, int decimalCount, boolean metricUnits, boolean reportSpeedOrPace) {
this.resources = resources;
this.decimalCount = decimalCount;
this.metricUnits = metricUnits;
this.reportSpeedOrPace = reportSpeedOrPace;
}
public String formatSpeed(Speed speed) {
Pair<String, String> distanceParts = getSpeedParts(speed);
return resources.getString(R.string.speed_with_unit, distanceParts.first, distanceParts.second);
}
/**
* Gets the formatted speed with unit.
*
* @return the formatted speed (or null) and it's unit as {@link Pair}
*/
public Pair<String, String> getSpeedParts(Speed speed) {
int unitId;
if (metricUnits) {
unitId = reportSpeedOrPace ? R.string.unit_kilometer_per_hour : R.string.unit_minute_per_kilometer;
} else {
unitId = reportSpeedOrPace ? R.string.unit_mile_per_hour : R.string.unit_minute_per_mile;
}
String unitString = resources.getString(unitId);
if (speed == null) {
speed = Speed.zero();
}
if (reportSpeedOrPace) {
return new Pair<>(StringUtils.formatDecimal(speed.to(metricUnits), 1), unitString);
}
int pace = (int) speed.toPace(metricUnits).getSeconds();
int minutes = pace / 60;
int seconds = pace % 60;
return new Pair<>(resources.getString(R.string.time, minutes, seconds), unitString);
}
public static Builder Builder() {
return new Builder();
}
public static class Builder {
private int decimalCount;
private boolean metricUnits;
private boolean reportSpeedOrPace;
public Builder() {
decimalCount = 2;
metricUnits = true;
reportSpeedOrPace = true;
}
public Builder setDecimalCount(int decimalCount) {
this.decimalCount = decimalCount;
return this;
}
public Builder setMetricUnits(boolean metricUnits) {
this.metricUnits = metricUnits;
return this;
}
public Builder setReportSpeedOrPace(boolean reportSpeedOrPace) {
this.reportSpeedOrPace = reportSpeedOrPace;
return this;
}
public SpeedFormatter build(Resources resource) {
return new SpeedFormatter(resource, decimalCount, metricUnits, reportSpeedOrPace);
}
public SpeedFormatter build(Context context) {
return build(context.getResources());
}
}
}