From 4a5f2406e7e98953b5536c21359e7580c5ab590f Mon Sep 17 00:00:00 2001 From: Jimmy Shih Date: Wed, 13 Nov 2013 13:41:44 -0800 Subject: [PATCH] Code cleanup for unit conversion --- .../apps/mytracks/DeleteAsyncTask.java | 6 ++- .../apps/mytracks/SensorStateActivity.java | 5 +- .../apps/mytracks/TrackController.java | 5 +- .../apps/mytracks/content/SearchEngine.java | 3 +- .../mytracks/fragments/StatsFragment.java | 4 +- .../io/file/exporter/TcxTrackWriter.java | 4 +- .../importer/AbstractFileTrackImporter.java | 9 ++-- .../services/TrackRecordingService.java | 10 +++- .../sensors/BluetoothSensorManager.java | 5 +- .../tasks/AnnouncementPeriodicTask.java | 7 +-- .../apps/mytracks/util/LocationUtils.java | 4 +- .../apps/mytracks/util/StringUtils.java | 8 ++-- .../apps/mytracks/util/UnitConversions.java | 47 ++++++++++--------- 13 files changed, 74 insertions(+), 43 deletions(-) diff --git a/MyTracks/src/com/google/android/apps/mytracks/DeleteAsyncTask.java b/MyTracks/src/com/google/android/apps/mytracks/DeleteAsyncTask.java index 02d3b617c..b3e7eeff7 100644 --- a/MyTracks/src/com/google/android/apps/mytracks/DeleteAsyncTask.java +++ b/MyTracks/src/com/google/android/apps/mytracks/DeleteAsyncTask.java @@ -20,6 +20,7 @@ import com.google.android.apps.mytracks.content.MyTracksProviderUtils; import com.google.android.apps.mytracks.content.Track; import com.google.android.apps.mytracks.io.sync.SyncUtils; import com.google.android.apps.mytracks.util.PreferencesUtils; +import com.google.android.apps.mytracks.util.UnitConversions; import com.google.android.maps.mytracks.R; import android.content.Context; @@ -32,6 +33,9 @@ import android.os.AsyncTask; */ public class DeleteAsyncTask extends AsyncTask { + // 1 second in milliseconds + private static final long ONE_SECOND = (long) UnitConversions.S_TO_MS; + private DeleteActivity deleteActivity; private final long[] trackIds; private final Context context; @@ -82,7 +86,7 @@ public class DeleteAsyncTask extends AsyncTask { if (isCancelled()) { return false; } - Thread.sleep(1000); + Thread.sleep(ONE_SECOND); } } catch (InterruptedException e) { return false; diff --git a/MyTracks/src/com/google/android/apps/mytracks/SensorStateActivity.java b/MyTracks/src/com/google/android/apps/mytracks/SensorStateActivity.java index 0c5848c07..4fabcb0d4 100644 --- a/MyTracks/src/com/google/android/apps/mytracks/SensorStateActivity.java +++ b/MyTracks/src/com/google/android/apps/mytracks/SensorStateActivity.java @@ -23,6 +23,7 @@ import com.google.android.apps.mytracks.services.sensors.SensorManager; import com.google.android.apps.mytracks.services.sensors.SensorManagerFactory; import com.google.android.apps.mytracks.services.sensors.SensorUtils; import com.google.android.apps.mytracks.util.TrackRecordingServiceConnectionUtils; +import com.google.android.apps.mytracks.util.UnitConversions; import com.google.android.maps.mytracks.R; import com.google.protobuf.InvalidProtocolBufferException; @@ -41,7 +42,9 @@ import android.widget.TextView; public class SensorStateActivity extends AbstractMyTracksActivity { private static final String TAG = SensorStateActivity.class.getName(); - private static final long ONE_SECOND = 1000; + + // 1 second in milliseconds + private static final long ONE_SECOND = (long) UnitConversions.S_TO_MS; private TrackRecordingServiceConnection trackRecordingServiceConnection; private Handler handler; diff --git a/MyTracks/src/com/google/android/apps/mytracks/TrackController.java b/MyTracks/src/com/google/android/apps/mytracks/TrackController.java index e4b6116f8..b1db9178d 100644 --- a/MyTracks/src/com/google/android/apps/mytracks/TrackController.java +++ b/MyTracks/src/com/google/android/apps/mytracks/TrackController.java @@ -19,6 +19,7 @@ package com.google.android.apps.mytracks; import com.google.android.apps.mytracks.services.ITrackRecordingService; import com.google.android.apps.mytracks.services.TrackRecordingServiceConnection; import com.google.android.apps.mytracks.util.StringUtils; +import com.google.android.apps.mytracks.util.UnitConversions; import com.google.android.maps.mytracks.R; import android.app.Activity; @@ -38,7 +39,9 @@ import android.widget.TextView; public class TrackController { private static final String TAG = TrackController.class.getSimpleName(); - private static final int ONE_SECOND = 1000; + + // 1 second in milliseconds + private static final long ONE_SECOND = (long) UnitConversions.S_TO_MS; private final Activity activity; private final TrackRecordingServiceConnection trackRecordingServiceConnection; diff --git a/MyTracks/src/com/google/android/apps/mytracks/content/SearchEngine.java b/MyTracks/src/com/google/android/apps/mytracks/content/SearchEngine.java index c92175336..658f274f5 100644 --- a/MyTracks/src/com/google/android/apps/mytracks/content/SearchEngine.java +++ b/MyTracks/src/com/google/android/apps/mytracks/content/SearchEngine.java @@ -360,7 +360,8 @@ public class SearchEngine { } // Score recent tracks higher. - long timeAgoHours = (query.currentTimestamp - timestamp) / (60L * 60L * 1000L); + long timeAgoHours = (long) ((query.currentTimestamp - timestamp) * UnitConversions.MS_TO_S + * UnitConversions.S_TO_MIN * UnitConversions.MIN_TO_HR); if (timeAgoHours > 0L) { return squash(timeAgoHours); } else { diff --git a/MyTracks/src/com/google/android/apps/mytracks/fragments/StatsFragment.java b/MyTracks/src/com/google/android/apps/mytracks/fragments/StatsFragment.java index 791bd1cfd..935b5cc9a 100644 --- a/MyTracks/src/com/google/android/apps/mytracks/fragments/StatsFragment.java +++ b/MyTracks/src/com/google/android/apps/mytracks/fragments/StatsFragment.java @@ -27,6 +27,7 @@ import com.google.android.apps.mytracks.util.LocationUtils; import com.google.android.apps.mytracks.util.PreferencesUtils; import com.google.android.apps.mytracks.util.StatsUtils; import com.google.android.apps.mytracks.util.TrackIconUtils; +import com.google.android.apps.mytracks.util.UnitConversions; import com.google.android.maps.mytracks.R; import android.location.Location; @@ -53,7 +54,8 @@ public class StatsFragment extends Fragment implements TrackDataListener { public static final String STATS_FRAGMENT_TAG = "statsFragment"; - private static final int ONE_SECOND = 1000; + // 1 second in milliseconds + private static final long ONE_SECOND = (long) UnitConversions.S_TO_MS; private TrackDataHub trackDataHub; private Handler handler; diff --git a/MyTracks/src/com/google/android/apps/mytracks/io/file/exporter/TcxTrackWriter.java b/MyTracks/src/com/google/android/apps/mytracks/io/file/exporter/TcxTrackWriter.java index add3b50fb..50821b208 100644 --- a/MyTracks/src/com/google/android/apps/mytracks/io/file/exporter/TcxTrackWriter.java +++ b/MyTracks/src/com/google/android/apps/mytracks/io/file/exporter/TcxTrackWriter.java @@ -23,6 +23,7 @@ import com.google.android.apps.mytracks.content.Waypoint; import com.google.android.apps.mytracks.io.file.TrackFileFormat; import com.google.android.apps.mytracks.util.StringUtils; import com.google.android.apps.mytracks.util.SystemUtils; +import com.google.android.apps.mytracks.util.UnitConversions; import com.google.android.maps.mytracks.R; import android.content.Context; @@ -172,7 +173,8 @@ public class TcxTrackWriter implements TrackWriter { if (printWriter != null) { String startTime = StringUtils.formatDateTimeIso8601( track.getTripStatistics().getStartTime()); - long totalTimeInSeconds = track.getTripStatistics().getTotalTime() / 1000; + long totalTimeInSeconds = (long) (track.getTripStatistics().getTotalTime() + * UnitConversions.MS_TO_S); printWriter.println(""); printWriter.println(""); diff --git a/MyTracks/src/com/google/android/apps/mytracks/io/file/importer/AbstractFileTrackImporter.java b/MyTracks/src/com/google/android/apps/mytracks/io/file/importer/AbstractFileTrackImporter.java index 36b6a7e82..7bb26ea6d 100644 --- a/MyTracks/src/com/google/android/apps/mytracks/io/file/importer/AbstractFileTrackImporter.java +++ b/MyTracks/src/com/google/android/apps/mytracks/io/file/importer/AbstractFileTrackImporter.java @@ -30,6 +30,7 @@ import com.google.android.apps.mytracks.util.LocationUtils; import com.google.android.apps.mytracks.util.PreferencesUtils; import com.google.android.apps.mytracks.util.StringUtils; import com.google.android.apps.mytracks.util.TrackIconUtils; +import com.google.android.apps.mytracks.util.UnitConversions; import com.google.android.maps.mytracks.R; import android.content.Context; @@ -412,10 +413,10 @@ abstract class AbstractFileTrackImporter extends DefaultHandler implements Track * last two points. GPS points tend to have some inherent imprecision, * speed and bearing will likely be off, so the statistics for things * like max speed will also be off. - */ - float speed = trackData.lastLocationInCurrentSegment.distanceTo(location) * 1000.0f - / timeDifference; - location.setSpeed(speed); + */ + double duration = timeDifference * UnitConversions.MS_TO_S; + double speed = trackData.lastLocationInCurrentSegment.distanceTo(location) / duration; + location.setSpeed((float) speed); } location.setBearing(trackData.lastLocationInCurrentSegment.bearingTo(location)); } diff --git a/MyTracks/src/com/google/android/apps/mytracks/services/TrackRecordingService.java b/MyTracks/src/com/google/android/apps/mytracks/services/TrackRecordingService.java index 21d149661..3183a3069 100644 --- a/MyTracks/src/com/google/android/apps/mytracks/services/TrackRecordingService.java +++ b/MyTracks/src/com/google/android/apps/mytracks/services/TrackRecordingService.java @@ -44,6 +44,7 @@ import com.google.android.apps.mytracks.util.PreferencesUtils; import com.google.android.apps.mytracks.util.SystemUtils; import com.google.android.apps.mytracks.util.TrackIconUtils; import com.google.android.apps.mytracks.util.TrackNameUtils; +import com.google.android.apps.mytracks.util.UnitConversions; import com.google.android.gms.common.ConnectionResult; import com.google.android.gms.common.GooglePlayServicesClient.ConnectionCallbacks; import com.google.android.gms.common.GooglePlayServicesClient.OnConnectionFailedListener; @@ -101,9 +102,14 @@ public class TrackRecordingService extends Service { public static final double MAX_NO_MOVEMENT_SPEED = 0.224; private static final String TAG = TrackRecordingService.class.getSimpleName(); - private static final long ONE_SECOND = 1000; // in milliseconds - private static final long ONE_MINUTE = 60 * ONE_SECOND; // in milliseconds + // 1 second in milliseconds + private static final long ONE_SECOND = (long) UnitConversions.S_TO_MS; + + // 1 minute in milliseconds + private static final long ONE_MINUTE = (long) (UnitConversions.MIN_TO_S + * UnitConversions.S_TO_MS); + @VisibleForTesting static final int MAX_AUTO_RESUME_TRACK_RETRY_ATTEMPTS = 3; diff --git a/MyTracks/src/com/google/android/apps/mytracks/services/sensors/BluetoothSensorManager.java b/MyTracks/src/com/google/android/apps/mytracks/services/sensors/BluetoothSensorManager.java index fb12c8f9a..f18eb29b3 100644 --- a/MyTracks/src/com/google/android/apps/mytracks/services/sensors/BluetoothSensorManager.java +++ b/MyTracks/src/com/google/android/apps/mytracks/services/sensors/BluetoothSensorManager.java @@ -19,6 +19,7 @@ package com.google.android.apps.mytracks.services.sensors; import com.google.android.apps.mytracks.content.Sensor.SensorDataSet; import com.google.android.apps.mytracks.content.Sensor.SensorState; import com.google.android.apps.mytracks.util.PreferencesUtils; +import com.google.android.apps.mytracks.util.UnitConversions; import com.google.android.maps.mytracks.R; import android.bluetooth.BluetoothAdapter; @@ -39,6 +40,8 @@ import java.util.ArrayList; */ public class BluetoothSensorManager extends SensorManager { + // 1 second in milliseconds + private static final long ONE_SECOND = (long) UnitConversions.S_TO_MS; private static final BluetoothAdapter bluetoothAdapter = getDefaultBluetoothAdapter(); private static final String TAG = BluetoothConnectionManager.class.getSimpleName(); @@ -69,7 +72,7 @@ public class BluetoothSensorManager extends SensorManager { while (adapters.isEmpty()) { synchronized (mutex) { try { - mutex.wait(1000L); + mutex.wait(ONE_SECOND); } catch (InterruptedException e) { Log.e(TAG, "Interrupted while waiting for default bluetooth adapter", e); } diff --git a/MyTracks/src/com/google/android/apps/mytracks/services/tasks/AnnouncementPeriodicTask.java b/MyTracks/src/com/google/android/apps/mytracks/services/tasks/AnnouncementPeriodicTask.java index 29c1c8bb2..6af09a8e8 100644 --- a/MyTracks/src/com/google/android/apps/mytracks/services/tasks/AnnouncementPeriodicTask.java +++ b/MyTracks/src/com/google/android/apps/mytracks/services/tasks/AnnouncementPeriodicTask.java @@ -50,8 +50,7 @@ public class AnnouncementPeriodicTask implements PeriodicTask { static final float TTS_SPEECH_RATE = 0.9f; private static final String TAG = AnnouncementPeriodicTask.class.getSimpleName(); - private static final long HOUR_TO_MILLISECOND = 60 * 60 * 1000; - + @VisibleForTesting static final HashMap SPEECH_PARAMS = new HashMap(); static { @@ -249,7 +248,9 @@ public class AnnouncementPeriodicTask implements PeriodicTask { } else { speed = speed == 0 ? 0.0 : 1 / speed; int paceId = metricUnits ? R.string.voice_pace_per_kilometer : R.string.voice_pace_per_mile; - rate = context.getString(paceId, getAnnounceTime((long) (speed * HOUR_TO_MILLISECOND))); + long time = (long) (speed * UnitConversions.HR_TO_MIN * UnitConversions.MIN_TO_S + * UnitConversions.S_TO_MS); + rate = context.getString(paceId, getAnnounceTime(time)); } int totalDistanceId = metricUnits ? R.plurals.voiceTotalDistanceKilometers diff --git a/MyTracks/src/com/google/android/apps/mytracks/util/LocationUtils.java b/MyTracks/src/com/google/android/apps/mytracks/util/LocationUtils.java index 41059aa1d..233ac9651 100644 --- a/MyTracks/src/com/google/android/apps/mytracks/util/LocationUtils.java +++ b/MyTracks/src/com/google/android/apps/mytracks/util/LocationUtils.java @@ -32,7 +32,9 @@ public class LocationUtils { private static final String TAG = LocationUtils.class.getSimpleName(); - private static final long MAX_LOCATION_AGE_MS = 60 * 1000; // 1 minute + // 1 minute in milliseconds + private static final long MAX_LOCATION_AGE_MS = (long) (UnitConversions.MIN_TO_S + * UnitConversions.S_TO_MS); private LocationUtils() {} diff --git a/MyTracks/src/com/google/android/apps/mytracks/util/StringUtils.java b/MyTracks/src/com/google/android/apps/mytracks/util/StringUtils.java index cac5829d1..809fcfc0a 100644 --- a/MyTracks/src/com/google/android/apps/mytracks/util/StringUtils.java +++ b/MyTracks/src/com/google/android/apps/mytracks/util/StringUtils.java @@ -81,7 +81,7 @@ public class StringUtils { */ public static String formatElapsedTime(long time) { /* - * Temporary workaround for DateUtils.formatElapsedTime(time / 1000). In API + * Temporary workaround for DateUtils.formatElapsedTime(time * MS_TO_S). In API * level 17, it returns strings like "1:0:00" instead of "1:00:00", which * breaks several unit tests. */ @@ -91,7 +91,7 @@ public class StringUtils { long hours = 0; long minutes = 0; long seconds = 0; - long elapsedSeconds = time / 1000; + long elapsedSeconds = (long) (time * UnitConversions.MS_TO_S); if (elapsedSeconds >= 3600) { hours = elapsedSeconds / 3600; @@ -314,7 +314,7 @@ public class StringUtils { if (fractional != null) { // Regex ensures fractional part is in (0,1) float fractionalSeconds = Float.parseFloat(fractional); - long fractionalMillis = (long) (fractionalSeconds * 1000.0f); + long fractionalMillis = (long) (fractionalSeconds * UnitConversions.S_TO_MS); time += fractionalMillis; } @@ -363,7 +363,7 @@ public class StringUtils { } int[] parts = new int[3]; - long seconds = time / 1000; + long seconds = (long) (time * UnitConversions.MS_TO_S); parts[0] = (int) (seconds % 60); int minutes = (int) (seconds / 60); parts[1] = minutes % 60; diff --git a/MyTracks/src/com/google/android/apps/mytracks/util/UnitConversions.java b/MyTracks/src/com/google/android/apps/mytracks/util/UnitConversions.java index 003de174a..ae838e542 100644 --- a/MyTracks/src/com/google/android/apps/mytracks/util/UnitConversions.java +++ b/MyTracks/src/com/google/android/apps/mytracks/util/UnitConversions.java @@ -25,9 +25,12 @@ public class UnitConversions { private UnitConversions() {} // Time - + + // multiplication factor to convert seconds to milliseconds + public static final double S_TO_MS = 1000.0; + // multiplication factor to convert milliseconds to seconds - public static final double MS_TO_S = 1 / 1000.0; + public static final double MS_TO_S = 1 / S_TO_MS; // multiplication factor to convert minutes to seconds public static final double MIN_TO_S = 60.0; @@ -41,16 +44,8 @@ public class UnitConversions { // multiplication factor to convert minutes to hours public static final double MIN_TO_HR = 1 / HR_TO_MIN; - // Weight - - // multiplication factor to convert kilograms to pounds - public static final double KG_TO_LB = 2.2046; - - // multiplication factor to convert pounds to kilograms - public static final double LB_TO_KG = 1 / KG_TO_LB; - // Distance - + // multiplication factor to convert kilometers to miles public static final double KM_TO_MI = 0.621371192; @@ -65,35 +60,43 @@ public class UnitConversions { // multiplication factor to covert kilometers to meters public static final double KM_TO_M = 1000.0; - + // multiplication factor to convert meters to kilometers public static final double M_TO_KM = 1 / KM_TO_M; - + // multiplication factor to convert meters to miles public static final double M_TO_MI = M_TO_KM * KM_TO_MI; // multiplication factor to convert meters to feet public static final double M_TO_FT = M_TO_MI * MI_TO_FT; - // multiplication factor to convert meters per second to kilometers per hour - public static final double MS_TO_KMH = 3.6; - + // Weight + + // multiplication factor to convert kilograms to pounds + public static final double KG_TO_LB = 2.2046; + + // multiplication factor to convert pounds to kilograms + public static final double LB_TO_KG = 1 / KG_TO_LB; + // Calories - + // multiplication factor to convert milliliters to liters public static final double ML_TO_L = 1 / 1000.0; - + // multiplication factor to convert liter to kcal public static final double L_TO_KCAL = 5.0; - + // multiplication factor to convert watt to kgm/min public static final double W_TO_KGM = 6.12; - + // multiplication factor to convert kgm to kcal public static final double KGM_TO_KCAL = 1 / 427.0; - + // Others - + + // multiplication factor to convert meters per second to kilometers per hour + public static final double MS_TO_KMH = M_TO_KM / (S_TO_MIN * MIN_TO_HR); + // multiplication factor to convert degrees to radians public static final double DEG_TO_RAD = Math.PI / 180.0; }