Code cleanup for unit conversion

This commit is contained in:
Jimmy Shih
2013-11-13 13:41:44 -08:00
parent 801b597fa0
commit 4a5f2406e7
13 changed files with 74 additions and 43 deletions
@@ -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.content.Track;
import com.google.android.apps.mytracks.io.sync.SyncUtils; import com.google.android.apps.mytracks.io.sync.SyncUtils;
import com.google.android.apps.mytracks.util.PreferencesUtils; import com.google.android.apps.mytracks.util.PreferencesUtils;
import com.google.android.apps.mytracks.util.UnitConversions;
import com.google.android.maps.mytracks.R; import com.google.android.maps.mytracks.R;
import android.content.Context; import android.content.Context;
@@ -32,6 +33,9 @@ import android.os.AsyncTask;
*/ */
public class DeleteAsyncTask extends AsyncTask<Void, Integer, Boolean> { public class DeleteAsyncTask extends AsyncTask<Void, Integer, Boolean> {
// 1 second in milliseconds
private static final long ONE_SECOND = (long) UnitConversions.S_TO_MS;
private DeleteActivity deleteActivity; private DeleteActivity deleteActivity;
private final long[] trackIds; private final long[] trackIds;
private final Context context; private final Context context;
@@ -82,7 +86,7 @@ public class DeleteAsyncTask extends AsyncTask<Void, Integer, Boolean> {
if (isCancelled()) { if (isCancelled()) {
return false; return false;
} }
Thread.sleep(1000); Thread.sleep(ONE_SECOND);
} }
} catch (InterruptedException e) { } catch (InterruptedException e) {
return false; return false;
@@ -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.SensorManagerFactory;
import com.google.android.apps.mytracks.services.sensors.SensorUtils; import com.google.android.apps.mytracks.services.sensors.SensorUtils;
import com.google.android.apps.mytracks.util.TrackRecordingServiceConnectionUtils; 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.android.maps.mytracks.R;
import com.google.protobuf.InvalidProtocolBufferException; import com.google.protobuf.InvalidProtocolBufferException;
@@ -41,7 +42,9 @@ import android.widget.TextView;
public class SensorStateActivity extends AbstractMyTracksActivity { public class SensorStateActivity extends AbstractMyTracksActivity {
private static final String TAG = SensorStateActivity.class.getName(); 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 TrackRecordingServiceConnection trackRecordingServiceConnection;
private Handler handler; private Handler handler;
@@ -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.ITrackRecordingService;
import com.google.android.apps.mytracks.services.TrackRecordingServiceConnection; import com.google.android.apps.mytracks.services.TrackRecordingServiceConnection;
import com.google.android.apps.mytracks.util.StringUtils; import com.google.android.apps.mytracks.util.StringUtils;
import com.google.android.apps.mytracks.util.UnitConversions;
import com.google.android.maps.mytracks.R; import com.google.android.maps.mytracks.R;
import android.app.Activity; import android.app.Activity;
@@ -38,7 +39,9 @@ import android.widget.TextView;
public class TrackController { public class TrackController {
private static final String TAG = TrackController.class.getSimpleName(); 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 Activity activity;
private final TrackRecordingServiceConnection trackRecordingServiceConnection; private final TrackRecordingServiceConnection trackRecordingServiceConnection;
@@ -360,7 +360,8 @@ public class SearchEngine {
} }
// Score recent tracks higher. // 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) { if (timeAgoHours > 0L) {
return squash(timeAgoHours); return squash(timeAgoHours);
} else { } else {
@@ -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.PreferencesUtils;
import com.google.android.apps.mytracks.util.StatsUtils; import com.google.android.apps.mytracks.util.StatsUtils;
import com.google.android.apps.mytracks.util.TrackIconUtils; import com.google.android.apps.mytracks.util.TrackIconUtils;
import com.google.android.apps.mytracks.util.UnitConversions;
import com.google.android.maps.mytracks.R; import com.google.android.maps.mytracks.R;
import android.location.Location; import android.location.Location;
@@ -53,7 +54,8 @@ public class StatsFragment extends Fragment implements TrackDataListener {
public static final String STATS_FRAGMENT_TAG = "statsFragment"; 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 TrackDataHub trackDataHub;
private Handler handler; private Handler handler;
@@ -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.io.file.TrackFileFormat;
import com.google.android.apps.mytracks.util.StringUtils; import com.google.android.apps.mytracks.util.StringUtils;
import com.google.android.apps.mytracks.util.SystemUtils; import com.google.android.apps.mytracks.util.SystemUtils;
import com.google.android.apps.mytracks.util.UnitConversions;
import com.google.android.maps.mytracks.R; import com.google.android.maps.mytracks.R;
import android.content.Context; import android.content.Context;
@@ -172,7 +173,8 @@ public class TcxTrackWriter implements TrackWriter {
if (printWriter != null) { if (printWriter != null) {
String startTime = StringUtils.formatDateTimeIso8601( String startTime = StringUtils.formatDateTimeIso8601(
track.getTripStatistics().getStartTime()); track.getTripStatistics().getStartTime());
long totalTimeInSeconds = track.getTripStatistics().getTotalTime() / 1000; long totalTimeInSeconds = (long) (track.getTripStatistics().getTotalTime()
* UnitConversions.MS_TO_S);
printWriter.println("<Activities>"); printWriter.println("<Activities>");
printWriter.println("<Activity Sport=\"" + sportType.getName() + "\">"); printWriter.println("<Activity Sport=\"" + sportType.getName() + "\">");
@@ -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.PreferencesUtils;
import com.google.android.apps.mytracks.util.StringUtils; import com.google.android.apps.mytracks.util.StringUtils;
import com.google.android.apps.mytracks.util.TrackIconUtils; import com.google.android.apps.mytracks.util.TrackIconUtils;
import com.google.android.apps.mytracks.util.UnitConversions;
import com.google.android.maps.mytracks.R; import com.google.android.maps.mytracks.R;
import android.content.Context; 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, * last two points. GPS points tend to have some inherent imprecision,
* speed and bearing will likely be off, so the statistics for things * speed and bearing will likely be off, so the statistics for things
* like max speed will also be off. * like max speed will also be off.
*/ */
float speed = trackData.lastLocationInCurrentSegment.distanceTo(location) * 1000.0f double duration = timeDifference * UnitConversions.MS_TO_S;
/ timeDifference; double speed = trackData.lastLocationInCurrentSegment.distanceTo(location) / duration;
location.setSpeed(speed); location.setSpeed((float) speed);
} }
location.setBearing(trackData.lastLocationInCurrentSegment.bearingTo(location)); location.setBearing(trackData.lastLocationInCurrentSegment.bearingTo(location));
} }
@@ -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.SystemUtils;
import com.google.android.apps.mytracks.util.TrackIconUtils; import com.google.android.apps.mytracks.util.TrackIconUtils;
import com.google.android.apps.mytracks.util.TrackNameUtils; 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.ConnectionResult;
import com.google.android.gms.common.GooglePlayServicesClient.ConnectionCallbacks; import com.google.android.gms.common.GooglePlayServicesClient.ConnectionCallbacks;
import com.google.android.gms.common.GooglePlayServicesClient.OnConnectionFailedListener; 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; public static final double MAX_NO_MOVEMENT_SPEED = 0.224;
private static final String TAG = TrackRecordingService.class.getSimpleName(); 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 @VisibleForTesting
static final int MAX_AUTO_RESUME_TRACK_RETRY_ATTEMPTS = 3; static final int MAX_AUTO_RESUME_TRACK_RETRY_ATTEMPTS = 3;
@@ -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.SensorDataSet;
import com.google.android.apps.mytracks.content.Sensor.SensorState; import com.google.android.apps.mytracks.content.Sensor.SensorState;
import com.google.android.apps.mytracks.util.PreferencesUtils; import com.google.android.apps.mytracks.util.PreferencesUtils;
import com.google.android.apps.mytracks.util.UnitConversions;
import com.google.android.maps.mytracks.R; import com.google.android.maps.mytracks.R;
import android.bluetooth.BluetoothAdapter; import android.bluetooth.BluetoothAdapter;
@@ -39,6 +40,8 @@ import java.util.ArrayList;
*/ */
public class BluetoothSensorManager extends SensorManager { 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 BluetoothAdapter bluetoothAdapter = getDefaultBluetoothAdapter();
private static final String TAG = BluetoothConnectionManager.class.getSimpleName(); private static final String TAG = BluetoothConnectionManager.class.getSimpleName();
@@ -69,7 +72,7 @@ public class BluetoothSensorManager extends SensorManager {
while (adapters.isEmpty()) { while (adapters.isEmpty()) {
synchronized (mutex) { synchronized (mutex) {
try { try {
mutex.wait(1000L); mutex.wait(ONE_SECOND);
} catch (InterruptedException e) { } catch (InterruptedException e) {
Log.e(TAG, "Interrupted while waiting for default bluetooth adapter", e); Log.e(TAG, "Interrupted while waiting for default bluetooth adapter", e);
} }
@@ -50,8 +50,7 @@ public class AnnouncementPeriodicTask implements PeriodicTask {
static final float TTS_SPEECH_RATE = 0.9f; static final float TTS_SPEECH_RATE = 0.9f;
private static final String TAG = AnnouncementPeriodicTask.class.getSimpleName(); private static final String TAG = AnnouncementPeriodicTask.class.getSimpleName();
private static final long HOUR_TO_MILLISECOND = 60 * 60 * 1000;
@VisibleForTesting @VisibleForTesting
static final HashMap<String, String> SPEECH_PARAMS = new HashMap<String, String>(); static final HashMap<String, String> SPEECH_PARAMS = new HashMap<String, String>();
static { static {
@@ -249,7 +248,9 @@ public class AnnouncementPeriodicTask implements PeriodicTask {
} else { } else {
speed = speed == 0 ? 0.0 : 1 / speed; speed = speed == 0 ? 0.0 : 1 / speed;
int paceId = metricUnits ? R.string.voice_pace_per_kilometer : R.string.voice_pace_per_mile; 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 int totalDistanceId = metricUnits ? R.plurals.voiceTotalDistanceKilometers
@@ -32,7 +32,9 @@ public class LocationUtils {
private static final String TAG = LocationUtils.class.getSimpleName(); 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() {} private LocationUtils() {}
@@ -81,7 +81,7 @@ public class StringUtils {
*/ */
public static String formatElapsedTime(long time) { 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 * level 17, it returns strings like "1:0:00" instead of "1:00:00", which
* breaks several unit tests. * breaks several unit tests.
*/ */
@@ -91,7 +91,7 @@ public class StringUtils {
long hours = 0; long hours = 0;
long minutes = 0; long minutes = 0;
long seconds = 0; long seconds = 0;
long elapsedSeconds = time / 1000; long elapsedSeconds = (long) (time * UnitConversions.MS_TO_S);
if (elapsedSeconds >= 3600) { if (elapsedSeconds >= 3600) {
hours = elapsedSeconds / 3600; hours = elapsedSeconds / 3600;
@@ -314,7 +314,7 @@ public class StringUtils {
if (fractional != null) { if (fractional != null) {
// Regex ensures fractional part is in (0,1) // Regex ensures fractional part is in (0,1)
float fractionalSeconds = Float.parseFloat(fractional); float fractionalSeconds = Float.parseFloat(fractional);
long fractionalMillis = (long) (fractionalSeconds * 1000.0f); long fractionalMillis = (long) (fractionalSeconds * UnitConversions.S_TO_MS);
time += fractionalMillis; time += fractionalMillis;
} }
@@ -363,7 +363,7 @@ public class StringUtils {
} }
int[] parts = new int[3]; int[] parts = new int[3];
long seconds = time / 1000; long seconds = (long) (time * UnitConversions.MS_TO_S);
parts[0] = (int) (seconds % 60); parts[0] = (int) (seconds % 60);
int minutes = (int) (seconds / 60); int minutes = (int) (seconds / 60);
parts[1] = minutes % 60; parts[1] = minutes % 60;
@@ -25,9 +25,12 @@ public class UnitConversions {
private UnitConversions() {} private UnitConversions() {}
// Time // Time
// multiplication factor to convert seconds to milliseconds
public static final double S_TO_MS = 1000.0;
// multiplication factor to convert milliseconds to seconds // 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 // multiplication factor to convert minutes to seconds
public static final double MIN_TO_S = 60.0; public static final double MIN_TO_S = 60.0;
@@ -41,16 +44,8 @@ public class UnitConversions {
// multiplication factor to convert minutes to hours // multiplication factor to convert minutes to hours
public static final double MIN_TO_HR = 1 / HR_TO_MIN; 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 // Distance
// multiplication factor to convert kilometers to miles // multiplication factor to convert kilometers to miles
public static final double KM_TO_MI = 0.621371192; public static final double KM_TO_MI = 0.621371192;
@@ -65,35 +60,43 @@ public class UnitConversions {
// multiplication factor to covert kilometers to meters // multiplication factor to covert kilometers to meters
public static final double KM_TO_M = 1000.0; public static final double KM_TO_M = 1000.0;
// multiplication factor to convert meters to kilometers // multiplication factor to convert meters to kilometers
public static final double M_TO_KM = 1 / KM_TO_M; public static final double M_TO_KM = 1 / KM_TO_M;
// multiplication factor to convert meters to miles // multiplication factor to convert meters to miles
public static final double M_TO_MI = M_TO_KM * KM_TO_MI; public static final double M_TO_MI = M_TO_KM * KM_TO_MI;
// multiplication factor to convert meters to feet // multiplication factor to convert meters to feet
public static final double M_TO_FT = M_TO_MI * MI_TO_FT; public static final double M_TO_FT = M_TO_MI * MI_TO_FT;
// multiplication factor to convert meters per second to kilometers per hour // Weight
public static final double MS_TO_KMH = 3.6;
// 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 // Calories
// multiplication factor to convert milliliters to liters // multiplication factor to convert milliliters to liters
public static final double ML_TO_L = 1 / 1000.0; public static final double ML_TO_L = 1 / 1000.0;
// multiplication factor to convert liter to kcal // multiplication factor to convert liter to kcal
public static final double L_TO_KCAL = 5.0; public static final double L_TO_KCAL = 5.0;
// multiplication factor to convert watt to kgm/min // multiplication factor to convert watt to kgm/min
public static final double W_TO_KGM = 6.12; public static final double W_TO_KGM = 6.12;
// multiplication factor to convert kgm to kcal // multiplication factor to convert kgm to kcal
public static final double KGM_TO_KCAL = 1 / 427.0; public static final double KGM_TO_KCAL = 1 / 427.0;
// Others // 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 // multiplication factor to convert degrees to radians
public static final double DEG_TO_RAD = Math.PI / 180.0; public static final double DEG_TO_RAD = Math.PI / 180.0;
} }