From 5aea1348f661817a3037ce5cbd19c9b9ce8c0db0 Mon Sep 17 00:00:00 2001 From: Jimmy Shih Date: Thu, 17 Nov 2011 20:10:57 -0800 Subject: [PATCH] Localize dates. Use DateFormat.getDateInstance for user visible dates. --- .../apps/mytracks/SensorStateActivity.java | 5 ++--- .../io/backup/BackupActivityHelper.java | 6 +++--- .../apps/mytracks/io/docs/DocsHelper.java | 14 ++++++-------- .../apps/mytracks/io/docs/DocsTagBuilder.java | 8 ++++---- .../apps/mytracks/io/file/CsvTrackWriter.java | 12 ++++-------- .../apps/mytracks/io/file/GpxTrackWriter.java | 13 +++---------- .../apps/mytracks/io/file/TcxTrackWriter.java | 14 ++++---------- .../services/DefaultTrackNameFactory.java | 6 ++---- .../android/apps/mytracks/util/FileUtils.java | 12 ++++++++++++ .../io/docs/DocsHelper_AddTrackRowTest.java | 17 ++++------------- .../mytracks/io/file/TcxTrackWriterTest.java | 17 ++--------------- .../services/DefaultTrackNameFactoryTest.java | 4 ++-- 12 files changed, 48 insertions(+), 80 deletions(-) diff --git a/MyTracks/src/com/google/android/apps/mytracks/SensorStateActivity.java b/MyTracks/src/com/google/android/apps/mytracks/SensorStateActivity.java index 2729ef423..404c13252 100644 --- a/MyTracks/src/com/google/android/apps/mytracks/SensorStateActivity.java +++ b/MyTracks/src/com/google/android/apps/mytracks/SensorStateActivity.java @@ -32,7 +32,7 @@ import android.os.RemoteException; import android.util.Log; import android.widget.TextView; -import java.text.SimpleDateFormat; +import java.text.DateFormat; import java.util.Date; import java.util.Timer; import java.util.TimerTask; @@ -44,8 +44,7 @@ import java.util.TimerTask; */ public class SensorStateActivity extends Activity { - private static final SimpleDateFormat TIMESTAMP_FORMAT = - new SimpleDateFormat("HH:mm:ss"); + private static final DateFormat TIMESTAMP_FORMAT = DateFormat.getTimeInstance(DateFormat.SHORT); private static final long REFRESH_PERIOD_MS = 250; private final StatsUtilities utils; diff --git a/MyTracks/src/com/google/android/apps/mytracks/io/backup/BackupActivityHelper.java b/MyTracks/src/com/google/android/apps/mytracks/io/backup/BackupActivityHelper.java index 60d0af6f4..0ad12be0b 100644 --- a/MyTracks/src/com/google/android/apps/mytracks/io/backup/BackupActivityHelper.java +++ b/MyTracks/src/com/google/android/apps/mytracks/io/backup/BackupActivityHelper.java @@ -32,7 +32,7 @@ import android.util.Log; import android.widget.Toast; import java.io.IOException; -import java.text.SimpleDateFormat; +import java.text.DateFormat; import java.util.Arrays; import java.util.Comparator; import java.util.Date; @@ -47,8 +47,8 @@ import java.util.Date; public class BackupActivityHelper { // Since the user sees this format, we use the local timezone - private static final SimpleDateFormat DISPLAY_BACKUP_FORMAT = - new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + private static final DateFormat DISPLAY_BACKUP_FORMAT = DateFormat.getDateTimeInstance( + DateFormat.SHORT, DateFormat.SHORT); private static final Comparator REVERSE_DATE_ORDER = new Comparator() { diff --git a/MyTracks/src/com/google/android/apps/mytracks/io/docs/DocsHelper.java b/MyTracks/src/com/google/android/apps/mytracks/io/docs/DocsHelper.java index 99a07a4bc..fb90a2280 100644 --- a/MyTracks/src/com/google/android/apps/mytracks/io/docs/DocsHelper.java +++ b/MyTracks/src/com/google/android/apps/mytracks/io/docs/DocsHelper.java @@ -34,7 +34,6 @@ import com.google.wireless.gdata.parser.ParseException; import com.google.wireless.gdata2.client.AuthenticationException; import android.content.Context; -import android.text.format.DateFormat; import android.util.Log; import java.io.BufferedReader; @@ -45,6 +44,7 @@ import java.io.OutputStream; import java.io.OutputStreamWriter; import java.net.URL; import java.net.URLConnection; +import java.text.DateFormat; import java.util.Date; import java.util.concurrent.atomic.AtomicReference; @@ -290,7 +290,7 @@ public class DocsHelper { DocsTagBuilder tagBuilder = new DocsTagBuilder(metricUnits) .append("name", track.getName()) .append("description", track.getDescription()) - .append("date", getDisplayDate(context, stats.getStartTime())) + .append("date", getDisplayDate(stats.getStartTime())) .append("totaltime", StringUtils.formatTimeAlwaysShowingHours( stats.getTotalTime())) .append("movingtime", StringUtils.formatTimeAlwaysShowingHours( @@ -331,17 +331,15 @@ public class DocsHelper { } /** - * Gets the display string for a time based on the phone's setting. + * Gets the display string for a time. * - * @param context the context to obtain the phone's setting. * @param time the time * @return the display string of the time */ - protected String getDisplayDate(Context context, long time) { - java.text.DateFormat dateFormat = DateFormat.getDateFormat(context); - java.text.DateFormat timeFormat = DateFormat.getTimeFormat(context); + private String getDisplayDate(long time) { + DateFormat format = DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT); Date startTime = new Date(time); - String dateString = dateFormat.format(startTime) + " " + timeFormat.format(startTime); + String dateString = format.format(startTime); return dateString; } diff --git a/MyTracks/src/com/google/android/apps/mytracks/io/docs/DocsTagBuilder.java b/MyTracks/src/com/google/android/apps/mytracks/io/docs/DocsTagBuilder.java index e89639998..8f937de6b 100644 --- a/MyTracks/src/com/google/android/apps/mytracks/io/docs/DocsTagBuilder.java +++ b/MyTracks/src/com/google/android/apps/mytracks/io/docs/DocsTagBuilder.java @@ -43,12 +43,12 @@ import java.text.NumberFormat; */ class DocsTagBuilder { - private static final NumberFormat LARGE_UNIT_FORMAT = NumberFormat.getIntegerInstance(); - private static final NumberFormat SMALL_UNIT_FORMAT = NumberFormat.getNumberInstance(); + private static final NumberFormat LARGE_UNIT_FORMAT = NumberFormat.getNumberInstance(); + private static final NumberFormat SMALL_UNIT_FORMAT = NumberFormat.getIntegerInstance(); static { - SMALL_UNIT_FORMAT.setMaximumFractionDigits(2); - SMALL_UNIT_FORMAT.setMinimumFractionDigits(2); + LARGE_UNIT_FORMAT.setMaximumFractionDigits(2); + LARGE_UNIT_FORMAT.setMinimumFractionDigits(2); } protected final boolean metricUnits; diff --git a/MyTracks/src/com/google/android/apps/mytracks/io/file/CsvTrackWriter.java b/MyTracks/src/com/google/android/apps/mytracks/io/file/CsvTrackWriter.java index 698557e96..4928c92ee 100644 --- a/MyTracks/src/com/google/android/apps/mytracks/io/file/CsvTrackWriter.java +++ b/MyTracks/src/com/google/android/apps/mytracks/io/file/CsvTrackWriter.java @@ -18,15 +18,14 @@ package com.google.android.apps.mytracks.io.file; import com.google.android.apps.mytracks.content.Track; import com.google.android.apps.mytracks.content.Waypoint; import com.google.android.apps.mytracks.io.file.TrackWriterFactory.TrackFileFormat; +import com.google.android.apps.mytracks.util.FileUtils; import android.location.Location; import java.io.OutputStream; import java.io.PrintWriter; import java.text.NumberFormat; -import java.text.SimpleDateFormat; import java.util.Date; -import java.util.TimeZone; /** * Exports a track as a CSV file, according to RFC 4180. @@ -46,13 +45,10 @@ import java.util.TimeZone; */ public class CsvTrackWriter implements TrackFormatWriter { - static final NumberFormat SHORT_FORMAT = NumberFormat.getInstance(); - static final SimpleDateFormat TIMESTAMP_FORMAT = - new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'"); + private static final NumberFormat SHORT_FORMAT = NumberFormat.getInstance(); static { SHORT_FORMAT.setMaximumFractionDigits(4); - TIMESTAMP_FORMAT.setTimeZone(TimeZone.getTimeZone("UTC")); } private int segmentIdx = 0; @@ -93,7 +89,7 @@ public class CsvTrackWriter implements TrackFormatWriter { @Override public void writeLocation(Location location) { - String timeStr = TIMESTAMP_FORMAT.format(new Date(location.getTime())); + String timeStr = FileUtils.FILE_TIMESTAMP_FORMAT.format(new Date(location.getTime())); writeCommaSeparatedLine("P", timeStr, Double.toString(location.getLatitude()), @@ -109,7 +105,7 @@ public class CsvTrackWriter implements TrackFormatWriter { @Override public void writeWaypoint(Waypoint waypoint) { Location location = waypoint.getLocation(); - String timeStr = TIMESTAMP_FORMAT.format(new Date(location.getTime())); + String timeStr = FileUtils.FILE_TIMESTAMP_FORMAT.format(new Date(location.getTime())); writeCommaSeparatedLine("WAYPOINT", timeStr, Double.toString(location.getLatitude()), diff --git a/MyTracks/src/com/google/android/apps/mytracks/io/file/GpxTrackWriter.java b/MyTracks/src/com/google/android/apps/mytracks/io/file/GpxTrackWriter.java index 6c3c3aef9..b86ec81e5 100644 --- a/MyTracks/src/com/google/android/apps/mytracks/io/file/GpxTrackWriter.java +++ b/MyTracks/src/com/google/android/apps/mytracks/io/file/GpxTrackWriter.java @@ -18,6 +18,7 @@ package com.google.android.apps.mytracks.io.file; import com.google.android.apps.mytracks.content.Track; import com.google.android.apps.mytracks.content.Waypoint; import com.google.android.apps.mytracks.io.file.TrackWriterFactory.TrackFileFormat; +import com.google.android.apps.mytracks.util.FileUtils; import com.google.android.apps.mytracks.util.StringUtils; import android.location.Location; @@ -27,10 +28,8 @@ import java.io.OutputStream; import java.io.PrintWriter; import java.nio.charset.Charset; import java.text.NumberFormat; -import java.text.SimpleDateFormat; import java.util.Date; import java.util.Locale; -import java.util.TimeZone; /** * Log of one track. @@ -38,11 +37,8 @@ import java.util.TimeZone; * @author Sandor Dornbush */ public class GpxTrackWriter implements TrackFormatWriter { - private static final String TIMESTAMP_FORMAT = "yyyy-MM-dd'T'HH:mm:ss'Z'"; - private final NumberFormat elevationFormatter; private final NumberFormat coordinateFormatter; - private final SimpleDateFormat timestampFormatter; private PrintWriter pw = null; private Track track; @@ -57,9 +53,6 @@ public class GpxTrackWriter implements TrackFormatWriter { coordinateFormatter.setMaximumFractionDigits(5); coordinateFormatter.setMaximumIntegerDigits(3); coordinateFormatter.setGroupingUsed(false); - - timestampFormatter = new SimpleDateFormat(TIMESTAMP_FORMAT); - timestampFormatter.setTimeZone(TimeZone.getTimeZone("UTC")); } private String formatLocation(Location l) { @@ -144,7 +137,7 @@ public class GpxTrackWriter implements TrackFormatWriter { pw.println(""); Date d = new Date(l.getTime()); pw.println("" + elevationFormatter.format(l.getAltitude()) + ""); - pw.println(""); + pw.println(""); pw.println(""); } } @@ -164,7 +157,7 @@ public class GpxTrackWriter implements TrackFormatWriter { if (l != null) { pw.println(""); pw.println("" + elevationFormatter.format(l.getAltitude()) + ""); - pw.println(""); + pw.println(""); pw.println("" + StringUtils.stringAsCData(waypoint.getName()) + ""); pw.println("" diff --git a/MyTracks/src/com/google/android/apps/mytracks/io/file/TcxTrackWriter.java b/MyTracks/src/com/google/android/apps/mytracks/io/file/TcxTrackWriter.java index 49961fbae..d1d797950 100644 --- a/MyTracks/src/com/google/android/apps/mytracks/io/file/TcxTrackWriter.java +++ b/MyTracks/src/com/google/android/apps/mytracks/io/file/TcxTrackWriter.java @@ -21,6 +21,7 @@ import com.google.android.apps.mytracks.content.Sensor.SensorDataSet; import com.google.android.apps.mytracks.content.Track; import com.google.android.apps.mytracks.content.Waypoint; import com.google.android.apps.mytracks.io.file.TrackWriterFactory.TrackFileFormat; +import com.google.android.apps.mytracks.util.FileUtils; import com.google.android.apps.mytracks.util.SystemUtils; import android.content.Context; @@ -30,10 +31,8 @@ import android.os.Build; import java.io.OutputStream; import java.io.PrintWriter; import java.nio.charset.Charset; -import java.text.SimpleDateFormat; import java.util.Date; import java.util.Locale; -import java.util.TimeZone; /** * Write out a a track in the Garmin training center database, tcx format. @@ -44,10 +43,9 @@ import java.util.TimeZone; * Garmin Training Center 3.5.3. * * @author Sandor Dornbush - * @author Dominik Ršttsches + * @author Dominik Ršttsches */ public class TcxTrackWriter implements TrackFormatWriter { - protected static final String TIMESTAMP_FORMAT = "yyyy-MM-dd'T'HH:mm:ss'Z'"; // These are the only sports allowed by the TCX v2 specification for fields // of type Sport_t. @@ -59,7 +57,6 @@ public class TcxTrackWriter implements TrackFormatWriter { private static final String TCX_TYPE_RELEASE = "Release"; private static final String TCX_TYPE_INTERNAL = "Internal"; - private final SimpleDateFormat timestampFormatter; private final Context context; private PrintWriter pw = null; @@ -70,9 +67,6 @@ public class TcxTrackWriter implements TrackFormatWriter { public TcxTrackWriter(Context context) { this.context = context; - - timestampFormatter = new SimpleDateFormat(TIMESTAMP_FORMAT); - timestampFormatter.setTimeZone(TimeZone.getTimeZone("UTC")); } @SuppressWarnings("hiding") @@ -117,7 +111,7 @@ public class TcxTrackWriter implements TrackFormatWriter { return; } - String startTime = timestampFormatter.format(track.getStatistics().getStartTime()); + String startTime = FileUtils.FILE_TIMESTAMP_FORMAT.format(track.getStatistics().getStartTime()); pw.println(" "); pw.format(" \n", categoryToTcxSport(track.getCategory())); @@ -150,7 +144,7 @@ public class TcxTrackWriter implements TrackFormatWriter { } pw.println(" "); Date d = new Date(location.getTime()); - pw.println(" "); + pw.println(" "); pw.println(" "); pw.print(" "); diff --git a/MyTracks/src/com/google/android/apps/mytracks/services/DefaultTrackNameFactory.java b/MyTracks/src/com/google/android/apps/mytracks/services/DefaultTrackNameFactory.java index e59b03d30..cd5cb2cd9 100644 --- a/MyTracks/src/com/google/android/apps/mytracks/services/DefaultTrackNameFactory.java +++ b/MyTracks/src/com/google/android/apps/mytracks/services/DefaultTrackNameFactory.java @@ -21,7 +21,7 @@ import com.google.android.maps.mytracks.R; import android.content.Context; import android.content.SharedPreferences; -import java.text.SimpleDateFormat; +import java.text.DateFormat; import java.util.Date; /** @@ -30,8 +30,6 @@ import java.util.Date; * @author Matthew Simmons */ class DefaultTrackNameFactory { - private static final String TIMESTAMP_DATE_FORMAT = "yyyy-MM-dd HH:mm"; - private final Context context; DefaultTrackNameFactory(Context context) { @@ -48,7 +46,7 @@ class DefaultTrackNameFactory { */ String newTrackName(long trackId, long startTime) { if (useTimestampTrackName()) { - SimpleDateFormat formatter = new SimpleDateFormat(TIMESTAMP_DATE_FORMAT); + DateFormat formatter = DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT); return formatter.format(new Date(startTime)); } else { return String.format(context.getString(R.string.track_name_format), trackId); diff --git a/MyTracks/src/com/google/android/apps/mytracks/util/FileUtils.java b/MyTracks/src/com/google/android/apps/mytracks/util/FileUtils.java index ac63cbba5..ffe0aecd1 100644 --- a/MyTracks/src/com/google/android/apps/mytracks/util/FileUtils.java +++ b/MyTracks/src/com/google/android/apps/mytracks/util/FileUtils.java @@ -20,6 +20,8 @@ import com.google.android.apps.mytracks.Constants; import android.os.Environment; import java.io.File; +import java.text.SimpleDateFormat; +import java.util.TimeZone; import java.util.regex.Pattern; /** @@ -39,6 +41,16 @@ public class FileUtils { private static final Pattern PROHIBITED_CHAR_PATTERN = Pattern.compile("[^ A-Za-z0-9_.()-]+"); + /** + * Timestamp format in UTC time zone. + */ + public static final SimpleDateFormat FILE_TIMESTAMP_FORMAT = + new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'"); + + static { + FILE_TIMESTAMP_FORMAT.setTimeZone(TimeZone.getTimeZone("UTC")); + } + /** * Builds a path inside the My Tracks directory in the SD card. * diff --git a/MyTracksTest/src/com/google/android/apps/mytracks/io/docs/DocsHelper_AddTrackRowTest.java b/MyTracksTest/src/com/google/android/apps/mytracks/io/docs/DocsHelper_AddTrackRowTest.java index d908e0e37..60e4dc33b 100644 --- a/MyTracksTest/src/com/google/android/apps/mytracks/io/docs/DocsHelper_AddTrackRowTest.java +++ b/MyTracksTest/src/com/google/android/apps/mytracks/io/docs/DocsHelper_AddTrackRowTest.java @@ -40,7 +40,8 @@ import junit.framework.TestCase; */ public class DocsHelper_AddTrackRowTest extends TestCase { private static final long TIME = 1288721514000L; - private static final DateFormat DATE_FORMAT = DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT); + private static final DateFormat DATE_FORMAT = DateFormat.getDateTimeInstance( + DateFormat.SHORT, DateFormat.SHORT); private static class StringWritingDocsHelper extends DocsHelper { String writtenSheetUri = null; @@ -55,12 +56,7 @@ public class DocsHelper_AddTrackRowTest extends TestCase { } public void testAddTrackRow_imperial() throws Exception { - StringWritingDocsHelper docsHelper = new StringWritingDocsHelper() { - @Override - protected String getDisplayDate(Context context, long time) { - return DATE_FORMAT.format(new Date(TIME)); - } - }; + StringWritingDocsHelper docsHelper = new StringWritingDocsHelper(); addTrackRow(docsHelper, false); String expectedData = @@ -94,12 +90,7 @@ public class DocsHelper_AddTrackRowTest extends TestCase { } public void testAddTrackRow_metric() throws Exception { - StringWritingDocsHelper docsHelper = new StringWritingDocsHelper() { - @Override - protected String getDisplayDate(Context context, long time) { - return DATE_FORMAT.format(new Date(TIME)); - } - }; + StringWritingDocsHelper docsHelper = new StringWritingDocsHelper(); addTrackRow(docsHelper, true); // The imperial test verifies that the tags come out in the proper order, diff --git a/MyTracksTest/src/com/google/android/apps/mytracks/io/file/TcxTrackWriterTest.java b/MyTracksTest/src/com/google/android/apps/mytracks/io/file/TcxTrackWriterTest.java index 380ca972f..6594cf51c 100644 --- a/MyTracksTest/src/com/google/android/apps/mytracks/io/file/TcxTrackWriterTest.java +++ b/MyTracksTest/src/com/google/android/apps/mytracks/io/file/TcxTrackWriterTest.java @@ -3,13 +3,9 @@ package com.google.android.apps.mytracks.io.file; import com.google.android.apps.mytracks.content.MyTracksLocation; import com.google.android.apps.mytracks.content.Sensor; -import com.google.android.apps.mytracks.io.file.TcxTrackWriter; -import com.google.android.apps.mytracks.io.file.TrackFormatWriter; +import com.google.android.apps.mytracks.util.FileUtils; -import java.text.DateFormat; -import java.text.SimpleDateFormat; import java.util.List; -import java.util.TimeZone; import org.w3c.dom.Document; import org.w3c.dom.Element; @@ -20,15 +16,6 @@ import org.w3c.dom.Element; * @author Sandor Dornbush */ public class TcxTrackWriterTest extends TrackFormatWriterTest { - private DateFormat timestampFormatter; - - @Override - public void setUp() throws Exception { - super.setUp(); - - timestampFormatter = new SimpleDateFormat(TcxTrackWriter.TIMESTAMP_FORMAT); - timestampFormatter.setTimeZone(TimeZone.getTimeZone("UTC")); - } public void testXmlOutput() throws Exception { TrackFormatWriter writer = new TcxTrackWriter(getContext()); @@ -72,7 +59,7 @@ public class TcxTrackWriterTest extends TrackFormatWriterTest { assertEquals(Double.toString(loc.getLongitude()), getChildTextValue(posTag, "LongitudeDegrees")); - assertEquals(timestampFormatter.format(loc.getTime()), + assertEquals(FileUtils.FILE_TIMESTAMP_FORMAT.format(loc.getTime()), getChildTextValue(tag, "Time")); assertEquals(Double.toString(loc.getAltitude()), getChildTextValue(tag, "AltitudeMeters")); diff --git a/MyTracksTest/src/com/google/android/apps/mytracks/services/DefaultTrackNameFactoryTest.java b/MyTracksTest/src/com/google/android/apps/mytracks/services/DefaultTrackNameFactoryTest.java index 855619cb7..9c5fbfc26 100644 --- a/MyTracksTest/src/com/google/android/apps/mytracks/services/DefaultTrackNameFactoryTest.java +++ b/MyTracksTest/src/com/google/android/apps/mytracks/services/DefaultTrackNameFactoryTest.java @@ -18,7 +18,7 @@ package com.google.android.apps.mytracks.services; import android.content.Context; import android.test.AndroidTestCase; -import java.text.SimpleDateFormat; +import java.text.DateFormat; import java.util.Date; /** @@ -52,7 +52,7 @@ public class DefaultTrackNameFactoryTest extends AndroidTestCase { DefaultTrackNameFactory factory = new MockDefaultTrackNameFactory(getContext(), true); - SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm"); + DateFormat formatter = DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT); assertEquals(formatter.format(new Date(TIMESTAMP)), factory.newTrackName(1, TIMESTAMP)); }