Skip to content

Commit 04aec2d

Browse files
authored
Update TimeFormatter to include localized Strings (#1106)
1 parent faf446d commit 04aec2d

File tree

7 files changed

+68
-37
lines changed

7 files changed

+68
-37
lines changed

libandroid-navigation-ui/src/main/java/com/mapbox/services/android/navigation/ui/v5/summary/SummaryModel.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@
1111

1212
import java.util.Calendar;
1313

14-
import static com.mapbox.services.android.navigation.v5.utils.time.TimeUtils.formatTime;
15-
import static com.mapbox.services.android.navigation.v5.utils.time.TimeUtils.formatTimeRemaining;
14+
import static com.mapbox.services.android.navigation.v5.utils.time.TimeFormatter.formatTime;
15+
import static com.mapbox.services.android.navigation.v5.utils.time.TimeFormatter.formatTimeRemaining;
1616

1717
public class SummaryModel {
1818

@@ -25,7 +25,7 @@ public SummaryModel(Context context, RouteProgress progress, String language,
2525
@NavigationTimeFormat.Type int timeFormatType) {
2626
distanceRemaining = new DistanceUtils(context, language, unitType)
2727
.formatDistance(progress.distanceRemaining()).toString();
28-
timeRemaining = formatTimeRemaining(progress.durationRemaining());
28+
timeRemaining = formatTimeRemaining(context, progress.durationRemaining());
2929
Calendar time = Calendar.getInstance();
3030
boolean isTwentyFourHourFormat = DateFormat.is24HourFormat(context);
3131
arrivalTime = formatTime(time, progress.durationRemaining(), timeFormatType, isTwentyFourHourFormat);

libandroid-navigation/src/main/java/com/mapbox/services/android/navigation/v5/navigation/MapboxNavigationNotification.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
import com.mapbox.services.android.navigation.v5.routeprogress.RouteProgress;
2121
import com.mapbox.services.android.navigation.v5.utils.DistanceUtils;
2222
import com.mapbox.services.android.navigation.v5.utils.ManeuverUtils;
23-
import com.mapbox.services.android.navigation.v5.utils.time.TimeUtils;
23+
import com.mapbox.services.android.navigation.v5.utils.time.TimeFormatter;
2424

2525
import java.util.Locale;
2626

@@ -188,15 +188,15 @@ private boolean newDistanceText(RouteProgress routeProgress) {
188188

189189
private void updateArrivalTime(RouteProgress routeProgress) {
190190
if (currentArrivalTime == null || newArrivalTime(routeProgress)) {
191-
currentArrivalTime = TimeUtils.formatArrivalTime(routeProgress.durationRemaining());
191+
currentArrivalTime = TimeFormatter.formatArrivalTime(routeProgress.durationRemaining());
192192
String formattedArrivalText = String.format(Locale.getDefault(), etaFormat, currentArrivalTime);
193193
collapsedNotificationRemoteViews.setTextViewText(R.id.notificationArrivalText, formattedArrivalText);
194194
expandedNotificationRemoteViews.setTextViewText(R.id.notificationArrivalText, formattedArrivalText);
195195
}
196196
}
197197

198198
private boolean newArrivalTime(RouteProgress routeProgress) {
199-
return currentArrivalTime != null && !currentArrivalTime.equals(TimeUtils
199+
return currentArrivalTime != null && !currentArrivalTime.equals(TimeFormatter
200200
.formatArrivalTime(routeProgress.durationRemaining()));
201201
}
202202

libandroid-navigation/src/main/java/com/mapbox/services/android/navigation/v5/navigation/NavigationTelemetry.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@
2525
import com.mapbox.services.android.navigation.v5.routeprogress.MetricsRouteProgress;
2626
import com.mapbox.services.android.navigation.v5.routeprogress.RouteProgress;
2727
import com.mapbox.services.android.navigation.v5.utils.RingBuffer;
28-
import com.mapbox.services.android.navigation.v5.utils.time.TimeUtils;
2928

3029
import java.util.ArrayList;
3130
import java.util.Arrays;
@@ -368,7 +367,7 @@ private void checkFeedbackQueue() {
368367
}
369368

370369
private boolean shouldSendEvent(SessionState sessionState) {
371-
return TimeUtils.dateDiff(sessionState.eventDate(), new Date(), TimeUnit.SECONDS) > TWENTY_SECOND_INTERVAL;
370+
return dateDiff(sessionState.eventDate(), new Date(), TimeUnit.SECONDS) > TWENTY_SECOND_INTERVAL;
372371
}
373372

374373
@NonNull
@@ -492,6 +491,11 @@ private void sendFeedbackEvent(FeedbackEvent feedbackEvent) {
492491
feedbackEvent.getFeedbackType(), feedbackEvent.getScreenshot(), feedbackEvent.getFeedbackSource());
493492
}
494493

494+
private long dateDiff(Date firstDate, Date secondDate, TimeUnit timeUnit) {
495+
long diffInMillis = secondDate.getTime() - firstDate.getTime();
496+
return timeUnit.convert(diffInMillis, TimeUnit.MILLISECONDS);
497+
}
498+
495499
private TelemetryEvent findQueuedTelemetryEvent(String eventId) {
496500
for (FeedbackEvent feedbackEvent : queuedFeedbackEvents) {
497501
if (feedbackEvent.getEventId().equals(eventId)) {

libandroid-navigation/src/main/java/com/mapbox/services/android/navigation/v5/route/FasterRouteDetector.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
import com.mapbox.api.directions.v5.models.RouteLeg;
99
import com.mapbox.services.android.navigation.v5.routeprogress.RouteProgress;
1010
import com.mapbox.services.android.navigation.v5.routeprogress.RouteStepProgress;
11-
import com.mapbox.services.android.navigation.v5.utils.time.TimeUtils;
1211

1312
import java.util.Date;
1413
import java.util.concurrent.TimeUnit;
@@ -128,6 +127,11 @@ private boolean validStepDurationRemaining(RouteProgress routeProgress) {
128127
}
129128

130129
private long secondsSinceLastCheck(Location location) {
131-
return TimeUtils.dateDiff(new Date(lastCheckedLocation.getTime()), new Date(location.getTime()), TimeUnit.SECONDS);
130+
return dateDiff(new Date(lastCheckedLocation.getTime()), new Date(location.getTime()), TimeUnit.SECONDS);
131+
}
132+
133+
private long dateDiff(Date firstDate, Date secondDate, TimeUnit timeUnit) {
134+
long diffInMillis = secondDate.getTime() - firstDate.getTime();
135+
return timeUnit.convert(diffInMillis, TimeUnit.MILLISECONDS);
132136
}
133137
}
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,28 @@
11
package com.mapbox.services.android.navigation.v5.utils.time;
22

3+
import android.content.Context;
4+
import android.content.res.Resources;
35
import android.graphics.Typeface;
46
import android.text.SpannableStringBuilder;
57
import android.text.style.RelativeSizeSpan;
68
import android.text.style.StyleSpan;
79

10+
import com.mapbox.services.android.navigation.R;
811
import com.mapbox.services.android.navigation.v5.navigation.NavigationTimeFormat;
912
import com.mapbox.services.android.navigation.v5.utils.span.SpanItem;
1013
import com.mapbox.services.android.navigation.v5.utils.span.SpanUtils;
1114
import com.mapbox.services.android.navigation.v5.utils.span.TextSpanItem;
1215

1316
import java.util.ArrayList;
1417
import java.util.Calendar;
15-
import java.util.Date;
1618
import java.util.List;
1719
import java.util.Locale;
1820
import java.util.concurrent.TimeUnit;
1921

20-
public class TimeUtils {
22+
public class TimeFormatter {
2123

2224
private static final String ARRIVAL_TIME_STRING_FORMAT = "%tl:%tM %tp";
23-
private static final String DAY = " day ";
24-
private static final String DAYS = " days ";
25-
private static final String HOUR = " hr ";
26-
private static final String MINUTE = " min ";
25+
private static final String TIME_STRING_FORMAT = " %s ";
2726

2827
public static String formatArrivalTime(double routeDuration) {
2928
Calendar calendar = Calendar.getInstance();
@@ -37,11 +36,10 @@ public static String formatTime(Calendar time, double routeDuration, @Navigation
3736
boolean isDeviceTwentyFourHourFormat) {
3837
time.add(Calendar.SECOND, (int) routeDuration);
3938
TimeFormattingChain chain = new TimeFormattingChain();
40-
String formattedTime = chain.setup(isDeviceTwentyFourHourFormat).obtainTimeFormatted(type, time);
41-
return formattedTime;
39+
return chain.setup(isDeviceTwentyFourHourFormat).obtainTimeFormatted(type, time);
4240
}
4341

44-
public static SpannableStringBuilder formatTimeRemaining(double routeDuration) {
42+
public static SpannableStringBuilder formatTimeRemaining(Context context, double routeDuration) {
4543
long seconds = (long) routeDuration;
4644

4745
if (seconds < 0) {
@@ -60,30 +58,45 @@ public static SpannableStringBuilder formatTimeRemaining(double routeDuration) {
6058
}
6159

6260
List<SpanItem> textSpanItems = new ArrayList<>();
61+
Resources resources = context.getResources();
62+
formatDays(resources, days, textSpanItems);
63+
formatHours(context, hours, textSpanItems);
64+
formatMinutes(context, minutes, textSpanItems);
65+
formatNoData(context, days, hours, minutes, textSpanItems);
66+
return SpanUtils.combineSpans(textSpanItems);
67+
}
68+
69+
private static void formatDays(Resources resources, long days, List<SpanItem> textSpanItems) {
6370
if (days != 0) {
64-
String dayFormat = days > 1 ? DAYS : DAY;
71+
String dayQuantityString = resources.getQuantityString(R.plurals.numberOfDays, (int) days);
72+
String dayString = String.format(TIME_STRING_FORMAT, dayQuantityString);
6573
textSpanItems.add(new TextSpanItem(new StyleSpan(Typeface.BOLD), String.valueOf(days)));
66-
textSpanItems.add(new TextSpanItem(new RelativeSizeSpan(1f), dayFormat));
74+
textSpanItems.add(new TextSpanItem(new RelativeSizeSpan(1f), dayString));
6775
}
76+
}
77+
78+
private static void formatHours(Context context, long hours, List<SpanItem> textSpanItems) {
6879
if (hours != 0) {
80+
String hourString = String.format(TIME_STRING_FORMAT, context.getString(R.string.hr));
6981
textSpanItems.add(new TextSpanItem(new StyleSpan(Typeface.BOLD), String.valueOf(hours)));
70-
textSpanItems.add(new TextSpanItem(new RelativeSizeSpan(1f), HOUR));
82+
textSpanItems.add(new TextSpanItem(new RelativeSizeSpan(1f), hourString));
7183
}
84+
}
85+
86+
private static void formatMinutes(Context context, long minutes, List<SpanItem> textSpanItems) {
7287
if (minutes != 0) {
88+
String minuteString = String.format(TIME_STRING_FORMAT, context.getString(R.string.min));
7389
textSpanItems.add(new TextSpanItem(new StyleSpan(Typeface.BOLD), String.valueOf(minutes)));
74-
textSpanItems.add(new TextSpanItem(new RelativeSizeSpan(1f), MINUTE));
90+
textSpanItems.add(new TextSpanItem(new RelativeSizeSpan(1f), minuteString));
7591
}
92+
}
93+
94+
private static void formatNoData(Context context, long days, long hours, long minutes,
95+
List<SpanItem> textSpanItems) {
7696
if (days == 0 && hours == 0 && minutes == 0) {
97+
String minuteString = String.format(TIME_STRING_FORMAT, context.getString(R.string.min));
7798
textSpanItems.add(new TextSpanItem(new StyleSpan(Typeface.BOLD), String.valueOf(1)));
78-
textSpanItems.add(new TextSpanItem(new RelativeSizeSpan(1f), MINUTE));
99+
textSpanItems.add(new TextSpanItem(new RelativeSizeSpan(1f), minuteString));
79100
}
80-
81-
return SpanUtils.combineSpans(textSpanItems);
82101
}
83-
84-
public static long dateDiff(Date date1, Date date2, TimeUnit timeUnit) {
85-
long diffInMillies = date2.getTime() - date1.getTime();
86-
return timeUnit.convert(diffInMillies, TimeUnit.MILLISECONDS);
87-
}
88-
89102
}

libandroid-navigation/src/main/res/values/strings.xml

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,4 +8,14 @@
88
<string name="miles">mi</string>
99
<string name="feet">ft</string>
1010
<string name="eta_format">%s ETA</string>
11+
12+
<!-- Time formatting -->
13+
<plurals name="numberOfDays">
14+
<item quantity="one">day</item>
15+
<item quantity="other">days</item>
16+
</plurals>
17+
<!-- Hour -->
18+
<string name="hr">hr</string>
19+
<!-- Minute -->
20+
<string name="min">min</string>
1121
</resources>
Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
import static org.junit.Assert.assertEquals;
88

9-
public class TimeUtilsTest {
9+
public class TimeFormatterTest {
1010

1111
@Test
1212
public void checksTwelveHoursTimeFormat() throws Exception {
@@ -22,7 +22,7 @@ public void checksTwelveHoursTimeFormat() throws Exception {
2222
int twelveHoursTimeFormatType = 0;
2323
boolean indifferentDeviceTwentyFourHourFormat = true;
2424

25-
String formattedTime = TimeUtils.formatTime(time, elevenMinutes, twelveHoursTimeFormatType,
25+
String formattedTime = TimeFormatter.formatTime(time, elevenMinutes, twelveHoursTimeFormatType,
2626
indifferentDeviceTwentyFourHourFormat);
2727

2828
assertEquals("6:29 pm", formattedTime);
@@ -42,7 +42,7 @@ public void checksTwentyFourHoursTimeFormat() throws Exception {
4242
int twentyFourHoursTimeFormatType = 1;
4343
boolean indifferentDeviceTwentyFourHourFormat = false;
4444

45-
String formattedTime = TimeUtils.formatTime(time, elevenMinutes, twentyFourHoursTimeFormatType,
45+
String formattedTime = TimeFormatter.formatTime(time, elevenMinutes, twentyFourHoursTimeFormatType,
4646
indifferentDeviceTwentyFourHourFormat);
4747

4848
assertEquals("18:29", formattedTime);
@@ -62,7 +62,7 @@ public void checksDefaultTwelveHoursTimeFormat() throws Exception {
6262
int noneSpecifiedTimeFormatType = -1;
6363
boolean deviceTwelveHourFormat = false;
6464

65-
String formattedTime = TimeUtils.formatTime(time, elevenMinutes, noneSpecifiedTimeFormatType,
65+
String formattedTime = TimeFormatter.formatTime(time, elevenMinutes, noneSpecifiedTimeFormatType,
6666
deviceTwelveHourFormat);
6767

6868
assertEquals("6:29 pm", formattedTime);
@@ -82,7 +82,7 @@ public void checksDefaultTwentyFourHoursTimeFormat() throws Exception {
8282
int noneSpecifiedTimeFormatType = -1;
8383
boolean deviceTwentyFourHourFormat = true;
8484

85-
String formattedTime = TimeUtils.formatTime(time, elevenMinutes, noneSpecifiedTimeFormatType,
85+
String formattedTime = TimeFormatter.formatTime(time, elevenMinutes, noneSpecifiedTimeFormatType,
8686
deviceTwentyFourHourFormat);
8787

8888
assertEquals("18:29", formattedTime);

0 commit comments

Comments
 (0)